2012-06-30 110 views
0

我的框架中有DTOmodel。 BLL和View根本沒有看到EntiyModel。我想在圖層之間傳輸和轉換複雜表達式。將複雜表達式<Func<TDTO>,bool>轉換爲表達式<bool>

這是在BLL這樣的方法......

//// BLL(Service) 
Public PersonDTO getAll(Expression<Func<PersonDTO, bool>> whereCondition) 
{ 

    return _repository.getAll(whereCondition); 

} 


// DLL(Repository) 

Public PersonDTO getAll(Expression<Func<PersonDTO, bool>> whereCondition) 
{ 

    Expression<Func<Person, bool>> NewCondition = ?/ How Convert DTOwhereCondition ??? 

    return DataContext.Persons(NewCondition); 

} 

/////我想在PersonDTO創建複雜的表達式是這樣的:

var persons = serive.getPersons(i => i.PersonDetailsDTO.Count == 3); 

//// /我的班級

 public class Person 
     { 
     public Int32 Id { get; set; } 
     public String FirstName { get; set; } 
     public String LastName { get; set; } 
     public List<PersonDetail> PersonDetails { get; set; } 
     } 


    public class PersonDTO 
     { 
     public Int32 Id { get; set; } 
     public String FirstName { get; set; } 
     public String LastName { get; set; } 
     public List<PersonDetailDTO> PersonDetailsDTO { get; set; } 
     } 
+0

這不是很清楚你試圖做什麼。您可能想要提供更多信息。如果你有表達式作爲參數,你可以**傳遞一個lambda表達式。 –

回答

0

這是最基本的解決方案。如果你需要更多的功能,也許你可以從那裏工作。到目前爲止,它允許可選地提供委託來解析映射的屬性名稱,但屬性類型必須相同。

用法:

var mappedExpression = 
    ExpressionMapper<Person>.MapFrom(originalDtoExpression, null); 

// or: 

var mappedExpression = 
    ExpressionMapper<Person>.MapFrom(originalDtoExpression, 
      entityPropertyName => someMapper.ResolveDtoPropertyName(entityPropertyName)); 

實現:

public class ExpressionMapper<TTarget> : ExpressionVisitor 
{ 
    protected ExpressionMapper(Type sourceType, Func<string, string> resolveTargetMemberNameFunc) 
    { 
     this.SourceType = sourceType; 
     this.ResolveTargetMemberNameFunc = resolveTargetMemberNameFunc ?? (cur => cur); 
    } 

    public Func<string, string> ResolveTargetMemberNameFunc { get; private set; } 

    public Type SourceType { get; private set; } 

    public static Expression MapFrom<TSource>(Expression sourceExpression, Func<string, string> resolveTargetMemberNameFunc) 
    { 
     return new ExpressionMapper<TTarget>(typeof(TSource), resolveTargetMemberNameFunc).Visit(sourceExpression); 
    } 

    public static Expression<Func<TTarget, bool>> MapFrom<TSource>(Expression<Func<TSource, bool>> sourcePredicateExpression, Func<string, string> resolveTargetMemberNameFunc) 
    { 
     return Expression.Lambda<Func<TTarget, bool>>(
       MapFrom<TSource>(sourcePredicateExpression.Body, resolveTargetMemberNameFunc), 
       Expression.Parameter(typeof(TTarget), sourcePredicateExpression.Parameters[0].Name)); 
    } 

    protected override Expression VisitMember(MemberExpression node) 
    { 
     var sourceMemberName = node.Member.Name; 
     var targetNode = this.Visit(node.Expression); 
     var targetMemberName = this.ResolveTargetMemberNameFunc(sourceMemberName); 
     var targetMember = targetNode.Type.GetMember(targetMemberName).FirstOrDefault(); 

     if (targetMember == null) 
     { 
      throw new NotSupportedException(String.Format("The source type '{0}' cannot be mapped to the target type '{1}', because that target type has no member '{2}'.", node.Expression.Type.Name, targetNode.Type.Name, targetMemberName)); 
     } 

     return Expression.MakeMemberAccess(targetNode, targetMember); 
    } 

    protected override Expression VisitParameter(ParameterExpression node) 
    { 
     if (node.Type == this.SourceType) 
     { 
      return Expression.Parameter(typeof(TTarget), node.Name); 
     } 

     return node; 
    } 
} 
+0

感謝您的回答。你測試了這段代碼嗎? 1-它爲複雜查詢返回錯誤,如下所示: var persons = serive.getPersons(i => i.PersonDetailsDTO.Count == 3); 2-它不適用於這樣的簡單查詢: var persons = serive.getPersons(i => i.firstName ==「name」); 當我執行WhereCondition並希望訪問Persons.Count()時,我檢索到此異常: ** {「參數'i'未綁定在指定的LINQ to Entities查詢表達式中。」} \t系統。 SystemException {System.InvalidOperationException}。** 謝謝。 –

+0

正如我所說的,這是最簡單的方法,可以作爲一個起點。一般來說,這是非常困難和複雜的,也許不可能添加任何可能的用例。如果你需要實現缺少的東西,你將不得不學習更多關於表達式樹的知識。 1)絕對不支持嵌套DTO。 2)這就是我一直使用它的原因,但沒有'.Count()'。現在還不能說這裏的問題是什麼。 – herzmeister

相關問題