2014-12-13 52 views
0

我正在寫一個通用的實體Dto Mapper,我有一個問題。我想以編程方式描述映射。C#表達式部分解析。 Curring?

public void ById(Expression<Func<TDto, object>> propertySelector, Expression<Func<TEntity, TDto, bool>> expression) { 
    // Just the Setter what will be mapped 
} 

所以在我我叫ById函數並通過所需的表達式。在這種情況下,這種映射描述瞭如何獲取Entity.UserId等於Dto.Id的實體列表。

ById((x, y) => x.UserId.Equals(y.Id)); 

後端服務本身也是通用的並由「TDto」類型生成。後端服務已經包含了一個「Where」函數來加入一個函數。

public List<TEntity> Where<TEntity>(Func<TEntity, bool> predicate) { 
    ObjectSet<TEntity> Column = _getGenericColumnByType(); 
    return Column.Where(predicate).ToList(); 
} 

所以通常我會按以下方式調用我的後端。

GenericBackendService<TEntity> Service = // generateMyService; 
Guid searchId = // my Guid im searching for 
var result = Service.Where(x => x.Id.Equals(searchId)); 

現在出現了我的問題。有沒有辦法解決我的(x,y)=> x.UserId.Equals(y.Id)表達式的第二部分,並創建一個像這樣的func對象x => x.UserId.Equals(「123 -456-678「)

public Func<TEntity, bool> MagicFunction(Expression<Func<TEntity, TDto, bool>> expression) { 
    // 
    // in -> (x, y) => x.UserId.Equals(y.Id) 
    // 
    // Do the magic 
    // 
    // out ->  x => x.UserId.Equals("The Id I resolved from y.Id") 
    // 
    return function; 
} 

回答

1

所以,答案是......你的魔法功能不能按照你的意圖工作。

當您在MagicFunction中時,您正在使用表達式樹。 y.Id在這個時間點沒有價值,所以你無法解決它。相反,你必須返回一個可以解析y.id的函數。在你的功能上添加參數極大地簡化了事情,並且實際上是同樣的事情.....

public static Func<TEntity, TDto, bool> MagicFunction(Expression<Func<TEntity, TDto, bool>> expression) 
    { 
     return expression.Compile(); 
    } 
+0

好吧,我明白了。然後,我需要過度理解我的概念。 – 2014-12-15 11:38:47