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

Entity framework 如何在实体框架中仅从对象图中选择特定属性?,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,我有一个简单的数据模型 car - make - model - year - colour - engine - model - no. cylinders - size - etc - fuel tank - model - capacity - fuel type - etc - etc 所以我有“汽车”、“发动机”和“油箱”实体。每个都有许多属性 我想要所有100辆汽车的列表,但只想显示以下选

我有一个简单的数据模型

car
 - make
 - model
 - year
 - colour
 - engine
     - model
     - no. cylinders
     - size
     - etc
 - fuel tank
     - model
     - capacity
     - fuel type
     - etc
 - etc
所以我有“汽车”、“发动机”和“油箱”实体。每个都有许多属性

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

我当然可以使用
.include
在对象图中恢复子实体,但这是一个巨大的成功,因为有许多属性

我的问题是,是否有一种简洁的方法可以做到这一点。或者以任何方式使用实体框架(理想情况下是EF7/Core)

[我确实提到了在匿名类中使用select的方法,但看不出如何在多个包含中工作]


谢谢。

如果您想收回完整的实体,您只需要使用
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,这将变成:

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

// Projection...
var cars = context.Cars.ProjectTo<CarModel>().ToList();
//(项目开始时)
初始化映射器(c=>{
c、 CreateMap();
});
//投影。。。
var cars=context.cars.ProjectTo().ToList();

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

如果您想收回完整的实体,您只需要使用
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,这将变成:

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

// Projection...
var cars = context.Cars.ProjectTo<CarModel>().ToList();
//(项目开始时)
初始化映射器(c=>{
c、 CreateMap();
});
//投影。。。
var cars=context.cars.ProjectTo().ToList();

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

Richard-这正是我需要的-非常感谢!我一直被困在包裹里。当然我不需要它们!是的,使用AutoMapper映射到DTO是一种方式。Richard-这正是我需要的-非常感谢!我一直被困在包裹里。当然我不需要它们!是的,使用AutoMapper映射到DTO是一个不错的选择。