使用Entity Framework读取复杂/相关数据

时间:2014-11-12 00:51:35

标签: c# sql-server entity-framework

我想从具有适当FK关系的表格City and Country中读取(使用EF)CityID,CityName,CountryID,CountryName等城市和国家/地区信息。

为此,我可以使用

  1. from x in db.Cities.Include("Country") select x - 这导致复杂的查询尝试读取所有不需要的列

  2. from x in db.Cities join y in db.Countries on x.CountryID equals y.CountryID select new CityDTO{ x.CityID, x.CityName, y.CountryID, y.CountryName} - 这会导致创建大量DTO类和转换。

  3. from x in db.CityView select x - 这会导致创建许多视图,每当我想获得其他列时,我都需要更新edmx。

  4. 在City类

  5. 中创建名为CountryName的其他属性

    并使用

    from x in db.Cities select x
    foreach (var city in x)
      city.CountryName = (from y  in db.Countries where ...)
    

    ***这是因为EF不允许我在查询中创建City对象,否则我会使用from x in db.Cities join y in db.Countries select new City{x.CityID, x.CountryID, x.CityName, y.CountryName}

    在这种情况下,最好的方法是什么(使用较少的实体和执行查询)?

1 个答案:

答案 0 :(得分:0)

怎么样

from x in db.Cities.Include("Country") 
select new { x.CityID, x.CityName, x.Country.CountryID, x.Country.CountryName }

这只选择指定的字段为anon类型,允许您只选择您关心的cols

要使用现有实体,您可以使用类似的语法,例如

from x in db.Cities.Include("Country") 
select new City { 
         CityID = x.CityID, 
         CityName = x.CityName, 
         Country = new Country{ 
                       CountryID = x.Country.CountryID, 
                       CountryName = x.Country.CountryName 
                   } 
         }

如果您查看这些表达式中的任何一个生成的SQL,您将看到它只选择提到的列。

请注意,不会跟踪从这两个查询返回的实体,因此您无法直接使用它来执行更新。