C# 使用实体框架读取复杂/相关数据

C# 使用实体框架读取复杂/相关数据,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我想使用EF City和Country信息,如CityID、CityName、CountryID、CountryName,从具有适当FK关系的City和Country表中读取 为此,我可以使用 从db.Cities.IncludeCountry中的x选择x-这将导致复杂查询,该查询尝试读取所有不需要的列 从db.Cities中的x加入db.Countries中的y。x.CountryID等于y.CountryID选择新的CityDTO{x.CityID,x.CityName,y.CountryI

我想使用EF City和Country信息,如CityID、CityName、CountryID、CountryName,从具有适当FK关系的City和Country表中读取

为此,我可以使用

从db.Cities.IncludeCountry中的x选择x-这将导致复杂查询,该查询尝试读取所有不需要的列

从db.Cities中的x加入db.Countries中的y。x.CountryID等于y.CountryID选择新的CityDTO{x.CityID,x.CityName,y.CountryID,y.CountryName}-这将导致创建大量的DTO类和转换

从db.CityView中的x选择x-这将创建许多视图,每当我想要获得额外的列时,我都需要更新edmx

在城市类中创建名为CountryName的附加属性

和使用

from x in db.Cities select x
foreach (var city in x)
  city.CountryName = (from y  in db.Countries where ...)
***这是因为EF不允许我在查询中创建City对象,否则我会在db中使用x。Cities在db中加入y。Countries选择new City{x.CityID,x.CountryID,x.CityName,y.CountryName}

在这种情况下,使用较少的实体并执行查询的最佳方式是什么?

如何

from x in db.Cities.Include("Country") 
select new { x.CityID, x.CityName, x.Country.CountryID, x.Country.CountryName }
这将仅将指定字段选择为anon类型,从而允许您仅选择所关心的列

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

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,您将看到它只选择了提到的列


但是,请注意,从这两个查询返回的实体都没有被跟踪,因此您不能直接使用它来执行更新。

您是否尝试过使用DataClassesDataContext并绕过EF来执行此操作,EF仍然允许您基于单个表或3个表(例如连接)执行适当的linq查询。。如果没有,您是否也知道List有一个List.foreach,如果您选择了x.tolist,您可能可以在linq查询中执行它。anon类型的唯一问题是,当使用I/O参数时,它们很难跨方法调用管理类型转换/访问属性。理想情况下,在企业应用程序中,这些对象必须在UI层、业务层和DAL之间流动?否则,选项要么选择为部分空且未跟踪的EF实体,要么使用anon类型。只是想知道如何使用部分空且未跟踪的EF实体。@KrishnaSarma请参见编辑,这是您想要的吗?