2017-09-27 52 views
0

我有一個包含EF Dbcontext和實體的DAL圖層。我有一個服務,其中包含一個方法,我希望從邏輯層執行簡單的選擇。Func <T, dynamic> to Func <TEntity,dynamic>

層: 邏輯=> DalService => DbContext.DbSet.Select(東西)

DAL不知道任何DTO模式。 邏輯層不知道任何實體。

基本上,我想轉換: Func<T, dynamic>選擇 到 Func<TEntity, dynamic>選擇,我可以基本上在DbSet<TEntity>使用。

感謝

+1

FWIW,我會考慮你的架構是一個反模式的東西,我相信你正在做這個分離的擔憂或使單元測試更容易。你的「邏輯」層應該直接訪問DbContext,以減少對複雜中間件的需求,比如你正在尋找的東西。如果需要,該層應該將任何結果映射到DTO模型。 –

+1

也許它是'表達式'而不是'Func ''? – ASpirin

+1

看到這個問題的類似要求:https://stackoverflow.com/questions/2797261/mutating-the-expression-tree-of-a-predicate-to-target-another-type –

回答

2

AutoMapper有一個叫做Expression Translation功能,可以做到從邏輯層查詢翻譯成你的DAL查詢的工作。

首先,需要設置從TEntity(從DAL你的實體類型)T(您的DTO從邏輯層)的映射:

Mapper.Initialize(cfg => cfg.CreateMap<TEntity, T>()); 

然後,當您的DAL從給定的查詢表達式邏輯層這樣例如:

Expression<Func<DTO, dynamic>> logicExpression = (dto) => new { dto.SomeProperty }; 

它可以像這樣它翻譯:

var dalExpression = Mapper.Map<Expression<Func<TEntity, dynamic>>>(logicExpression); 

最後被調用針對您的EF背景:

var results = context.SomeSet.Select(dalExpression).ToList(); 
+0

是的,正確的。然而,動態手段我試圖: 方法:動態GetMyModelById (長ID,函數功能 F){} 用法:GetMyModelById (1,F =>新的{f.code,f.name}) – MrH40XX

+1

'AutoMapper'映射** data **,它不映射表達式或lambda。 – Maarten

+1

我不是在尋找automapper。我正在尋找動態映射。我想要一個我在邏輯層上定義的匿名對象。我想獲得實體,但不是所有的領域。由於我的實體包含很多字段,我只想選擇一些字段。我不想製作100個模型和100個不同的方法,只選擇不同的領域。 – MrH40XX

相關問題