【问题标题】:How to only select specific properties from an object graph in Entity Framework?如何仅从实体框架中的对象图中选择特定属性?
【发布时间】:2016-04-12 12:25:38
【问题描述】:

我有一个简单的数据模型

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)的任何方式?

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

谢谢。

【问题讨论】:

    标签: entity-framework entity-framework-core


    【解决方案1】:

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

    【讨论】:

    • Richard - 这正是我所需要的 - 非常感谢!我一直被困在 .Includes 上,但我当然不需要它们!是的,使用 AutoMapper 映射到 DTO 是可行的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多