Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架从导航属性对象中选择几个字段_Entity Framework_Linq - Fatal编程技术网

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,…};