我有一个简单的查询:
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>
有没有办法创建只获得少数字段的查询?
答案 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有“获取所有汽车”的功能
顺便说一句,将数据从数据库传输到本地进程通常是处理过程中较慢的部分,因此尽可能少地传输数据总是明智的。尽量避免转移您不打算使用的属性。