Entity framework 实体框架从导航属性对象中选择几个字段
我有一个简单的问题:Entity framework 实体框架从导航属性对象中选择几个字段,entity-framework,linq,Entity Framework,Linq,我有一个简单的问题: var car = CarRepository.GetById(1); var engine = new EngineDto { Prop1 = car.Engine.Prop1, Prop2 = car.Engine.Prop2, Prop3 = car.Engine.Prop3, Prop4 = car.Engine.Prop4 } 问题是引擎模型有50多列,当我尝试获取引擎模型属性实体框架的值时,生成查询 SELECT TOP(1)
var car = CarRepository.GetById(1);
var engine = new EngineDto
{
Prop1 = car.Engine.Prop1,
Prop2 = car.Engine.Prop2,
Prop3 = car.Engine.Prop3,
Prop4 = car.Engine.Prop4
}
问题是引擎模型有50多列,当我尝试获取引擎模型属性实体框架的值时,生成查询
SELECT TOP(1) * FROM Engine WHERE ID = <id>
从ID=
有没有办法创建只获取少数字段的查询?是的,有一种方法:不获取完整的实体,而是使用Enumerable。选择此项仅获取您计划使用的数据 为此,您的CarRepository需要一个返回
IEnumerable
(或类似IQueryable)的函数
分两步进行:
EngineDto engine = CarRepository.QueryCars() // function to fetch IEnumerable<Car>
.Where(car => car.Id == 1)
.Select(car => new EngineDto
{
Prop1 = car.Engine.Prop1,
Prop2 = car.Engine.Prop2,
Prop3 = car.Engine.Prop3,
Prop4 = car.Engine.Prop4,
})
.SingleOrDefault();
EngineDto engine=CarRepository.QueryCars()//获取IEnumerable的函数
.Where(car=>car.Id==1)
.选择(汽车=>新发动机到
{
Prop1=汽车发动机Prop1,
Prop2=汽车发动机Prop2,
Prop3=汽车发动机Prop3,
Prop4=汽车发动机Prop4,
})
.SingleOrDefault();
如果CarRepository的设计者没有提供返回一系列汽车的功能,那么显然他认为没有人会想要它。但我很确定,CarRepository有一个“取所有汽车”的功能
顺便说一句,由于将数据从数据库传输到本地进程通常是处理过程中较慢的部分,因此传输尽可能少的数据总是明智的。尽量避免传输您不打算使用的属性。如果存储库将返回IQueryable而不是Car,则可以使用简单的选择,否则为否。它将返回IQueryable,但强制转换到DTO将在扩展方法中发生在
CarRepository.GetById
中,您应该添加Include:返回db.Cars.Where(x=>x.Id==Id).Include(x=>x.Engine).First()
你不明白我的问题。引擎模型已经包含在延迟加载中。@Maks告诉我你的CarRepository,GetById做什么,在理想世界中你应该能够调用Car表Car.Include(x=>x.Engine)。其中(x=>x.Id==1)。选择(x=>{Prop1=x.Engine.Prop1,Prop2=x.Engine.Prop2,Prop3=x.Engine.Prop3,Prop4=x.Engine.Prop4})。Single();因此只获取必要的字段,而不是所有列。谢谢您的回复。请看我的最后一个问题comment@Maks这是你应该做的,如果你已经有了实体“myCar”,你应该换到哪里。在哪里(car=>car.Id==myCar.Id)@kris,我专门为你澄清了我的问题。你知道,如何从已经选择的实体中获取一些导航对象属性吗?@Maks-hmm我不知道该怎么做,如果LINQ-Select可以处理单个对象就好了:)但是,如果已获取实体,则仍然只能获取引擎属性,如Harald show youLinq select on single object?这只是一个投影,即创建一个类的新对象,并使用从另一个类获取的值填充属性。例如:OtherClass X=new OtherClass(){Prop1=thisClass.ValueA,Prop2=thisClass.ValueB,…};