将我的实体框架列表视为poco列表

时间:2012-02-25 16:07:35

标签: asp.net entity-framework-4

不确定我是否正确地问这个问题(我是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对象,因为我打算在其他地方使用它

由于

2 个答案:

答案 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;
    }
}