我有一个简单的数据模型
car
- make
- model
- year
- colour
- engine
- model
- no. cylinders
- size
- etc
- fuel tank
- model
- capacity
- fuel type
- etc
- etc
所以我有"汽车"、"发动机"one_answers"油箱"实体。每个都具有多个属性。
我想要一个所有100辆汽车的列表,但只想显示以下选定的属性:car.make, car.model, car.year, car.engine, car.size, car.fueltype
。
我当然可以使用.include
来恢复对象图中的子实体,但这是一个很大的成功,因为有很多属性。
我的问题是,是否有一种巧妙的方法可以做到这一点。或者以任何方式使用实体框架(理想情况下为EF7/Core)?
[我确实提到https://colinmackay.scot/2011/07/31/getting-just-the-columns-you-want-from-entity-framework/它将select使用到一个匿名类中,但看不到它如何在多个include]中工作
谢谢你。
如果您想收回完整的实体,只需要使用Include
-您不需要这些来进行投影。可以匿名进行投影,也可以使用已定义的模型类进行投影。下面的代码应该让你开始:
// Define model...
public class CarModel
{
public string Make { get; set; }
public string Model { get; set; }
public int EngineCC { get; set; }
}
// Project to list of models
var cars = context.Cars.Select(c => new CarModel
{
Make = c.Make,
Model = c.Model,
EngineCC = c.Engine.CC
}).ToList();
通过使用映射库(如AutoMapper),可以简化此操作。使用AutoMapper,这就变成了:
// (at start of project)
Mapper.Initialize(c => {
c.CreateMap<Car, CarModel>();
});
// Projection...
var cars = context.Cars.ProjectTo<CarModel>().ToList();
在本例中,EngineCC是从Engine.CC自动映射的,但您可以手动指定任何不只是自动工作的映射。AutoMapper将创建一个Linq投影,只带回您需要的属性。