2016-04-12 67 views
1

我有一個簡單的數據模型如何只從實體框架中的對象圖中選擇特定屬性?

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/它使用到選擇一個匿名類,卻不見這是怎麼多內工作包括]

謝謝你。

回答

2

您只需要使用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投影,只返回你需要的屬性。

+0

理查德 - 這正是我需要的 - 非常感謝!我一直被困在.Includes當然,我不需要他們做!是的,使用AutoMapper映射到DTO是一種方法。 –

相關問題