不确定我是否正确地问这个问题(我是EF新手)。
基本上这是我的问题。我有一个名为Cities的类,这是一个非常简单的类,但它完全映射我的db表
public class City
{
public int Id { get; set; }
public string Country { get; set; }
public string Province { get; set; }
public string CityName { get; set; }
public City()
{
// TODO: Add constructor logic here
}
}
现在我的系统中有一个城市列表 公共列表城市{get;私人集; }
和这样的linq查询
using (MYdbEntities myentity = new MYdbEntities())
{
var efCities = (from c in myentity.Cities
orderby c.CityName
select c);
Cities = efCities.ToList(); //this line croaks
}
所以我得到的问题是linq从模型中返回实体列表,而Cities是City对象的列表,它们是不同的。 但我怎样才能将efCities投射到城市中(没有用我自己的映射做出可怕的循环)
我谷歌广告得到关于T4生成的模板的奇怪的东西 请为我愚蠢:))
我想在不知道实体框架的情况下尽可能简化我的City对象,因为我打算在其他地方使用它
由于
答案 0 :(得分:1)
如果我理解你的话,你的城市类(模型)与EF创建的类别不同,但具有相同的属性。
基于你拥有的最简单的方法是
var myCities = (efCities.Select(o=> new City() {
Id = o.Id,
Country = o.Country
....
}).ToList();
请原谅格式,在iPad上很难。
基本上你正在做的是创建City类的新列表,映射Select函数中的每个属性。
您也可以使用AutoMapper之类的东西自动映射/填充您的Cities类。您可以在http://automapper.codeplex.com/找到AutoMapper。
希望有所帮助
萨姆
答案 1 :(得分:0)
您可以编写扩展方法CopyTo
以将源对象的属性复制到destionation对象(具有相同的名称)。您的select c
现在是select c.CopyTo<City>()
示例:
public class City1
{
public int Id { get; set; }
public string Country { get; set; }
public string Province { get; set; }
public string CityName { get; set; }
}
public class City2
{
public int Id { get; set; }
public string Country { get; set; }
public string Province { get; set; }
public string CityName { get; set; }
}
City2 c2 = new City2();
new City1() {
Id = 3, Country = "aaa", Province = "bbb", CityName = "ccc" }
.Copy(c2);
//or
City2 c2 = new City1() {
Id = 3, Country = "aaa", Province = "bbb", CityName = "ccc" }
.Copy<City2>();
public static class MyExtensions
{
public static void CopyTo(this object src, object to)
{
Type dstType = to.GetType();
foreach (var prop in src.GetType()
.GetProperties()
.Select(pi => new { Name = pi.Name, Value = pi.GetValue(src, null) }))
{
dstType.GetProperty(prop.Name).SetValue(to, prop.Value, null);
}
}
public static T CopyTo<T>(this object src)
{
Type dstType = typeof(T);
T to = (T)Activator.CreateInstance(dstType);
CopyTo(src, to);
return to;
}
}