实体框架从导航属性对象中选择几个字段

时间:2018-02-18 21:30:48

标签: 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
}

问题是Engine模型有超过50列,当我尝试获取Engine模型属性Entity Framework的值时生成查询

SELECT TOP(1) * FROM Engine WHERE ID = <id>

有没有办法创建只获得少数字段的查询?

1 个答案:

答案 0 :(得分:0)

是的,有一种方法:不要获取完整的实体,而是使用Enumerable.Select来获取您计划使用的数据。

为此你的CarRepository需要一个返回IEnumerable<Car>(或类似的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();

如果CarRepository的设计者没有提供可以返回一系列Cars的功能,那么显然他认为没有人会想要它。但我很确定CarRepository有“获取所有汽车”的功能

顺便说一句,将数据从数据库传输到本地进程通常是处理过程中较慢的部分,因此尽可能少地传输数据总是明智的。尽量避免转移您不打算使用的属性。

相关问题