如何仅从Entity Framework中的对象图中选择特定属性?

时间:2016-04-12 12:25:38

标签: entity-framework entity-framework-core

我有一个简单的数据模型

car
 - make
 - model
 - year
 - colour
 - engine
     - model
     - no. cylinders
     - size
     - etc
 - fuel tank
     - model
     - capacity
     - fuel type
     - etc
 - etc

所以我有' car'引擎'和“'油箱'实体。每个都有很多属性。

我想要列出所有100辆汽车,但只想显示以下所选属性:car.make, car.model, car.year, car.engine, car.size, car.fueltype

我当然可以使用.include来恢复对象图中的子实体,但由于有很多属性,这是一个很大的打击。

我的问题是,是否有一个简洁的方法来做到这一点。或者实际上使用Entity Framework(理想情况下是EF7 / Core)?

[我确实引用了https://colinmackay.scot/2011/07/31/getting-just-the-columns-you-want-from-entity-framework/,它将select用于匿名类,但无法看到它在多个包含中如何工作]

谢谢你。

1 个答案:

答案 0 :(得分:4)

如果您想要取回整个实体,则只需使用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投影,只返回您需要的属性。

相关问题