我想从具有适当FK关系的表格City and Country中读取(使用EF)CityID,CityName,CountryID,CountryName等城市和国家/地区信息。
为此,我可以使用
from x in db.Cities.Include("Country") select x
- 这导致复杂的查询尝试读取所有不需要的列
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类和转换。
from x in db.CityView select x
- 这会导致创建许多视图,每当我想获得其他列时,我都需要更新edmx。
在City类
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}
在这种情况下,最好的方法是什么(使用较少的实体和执行查询)?
答案 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,您将看到它只选择提到的列。
请注意,不会跟踪从这两个查询返回的实体,因此您无法直接使用它来执行更新。