如何在实体框架中仅从对象图中选择特定属性



我有一个简单的数据模型

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投影,只带回您需要的属性。

最新更新