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

Mar*_*low 1 entity-framework entity-framework-core

我有一个简单的数据模型

car
 - make
 - model
 - year
 - colour
 - engine
     - model
     - no. cylinders
     - size
     - etc
 - fuel tank
     - model
     - capacity
     - fuel type
     - etc
 - etc
Run Code Online (Sandbox Code Playgroud)

所以我有“汽车”、“引擎”和“油箱”实体。每个都有许多属性。

我想要一个包含所有 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/它使用选择进入匿名类,但看不到这如何在多个包含中工作]

谢谢。

Ric*_*ard 5

你只需要使用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();
Run Code Online (Sandbox Code Playgroud)

您可以通过使用诸如AutoMapper 之类的映射库使这变得更简单。使用 AutoMapper,这变成:

// (at start of project)
Mapper.Initialize(c => {
    c.CreateMap<Car, CarModel>();
});

// Projection...
var cars = context.Cars.ProjectTo<CarModel>().ToList();
Run Code Online (Sandbox Code Playgroud)

在此示例中,EngineCC 是从 Engine.CC 自动映射的,但您可以手动指定任何不自动工作的映射。AutoMapper 将创建一个 Linq 投影,只带回您需要的属性。