2011-12-05 22 views
8

Tôi muốn tạo ra một phương pháp thông qua một biểu hiện của loại Expression<Func<T, string> để tạo ra biểu hiện của loại Expression<Func<T, bool>> để lọc thuộc tính chuỗi với StartsWith, EndsWithContains phương pháp như các biểu thức:Tạo một biểu thức với StartsWith, EndsWith LINQ và Có đi qua một Expression <Func <T, string>>

.Where(e => e.MiProperty.ToUpper().StartsWith("ABC")); 
.Where(e => e.MiProperty.ToUpper().EndsWith("XYZ")); 
.Where(e => e.MiProperty.ToUpper().Contains("MNO")); 

phương pháp này sẽ giống như thế:

public Expression<Func<T, bool>> AddFilterToStringProperty<T>(Expresssion<Func<T, string>> pMyExpression, string pFilter, FilterType pFiltertype) 

nơi FilterType là một kiểu enum có chứa ba trong số các hoạt động nêu (StartsWith, EndsWith, Contains)

+8

. Hãy cho chúng tôi biết những gì bạn thử và nếu nó không hoạt động, chúng tôi sẽ sẵn lòng trợ giúp. – drdwilcox

Trả lời

7

Hãy thử điều này:

public static Expression<Func<T, bool>> AddFilterToStringProperty<T>(
    Expression<Func<T, string>> expression, string filter, FilterType type) 
{ 
    return Expression.Lambda<Func<T, bool>>(
     Expression.Call(
      expression.Body, 
      type.ToString(), 
      null, 
      Expression.Constant(filter)), 
     expression.Parameters); 
} 
+0

Tôi đã thêm biểu thức "không null" vào câu trả lời này –

4

Cảm ơn @dtb. Nó hoạt động tốt và tôi thêm một biểu thức "không null" cho trường hợp này như sau:

public static Expression<Func<T, bool>> AddFilterToStringProperty2<T>(
         Expression<Func<T, string>> expression, string filter, FilterType type) 
    { 
     var vNotNullExpresion = Expression.NotEqual(
           expression.Body, 
           Expression.Constant(null)); 

     var vMethodExpresion = Expression.Call(
       expression.Body, 
       type.ToString(), 
       null, 
       Expression.Constant(filter)); 

     var vFilterExpresion = Expression.AndAlso(vNotNullExpresion, vMethodExpresion); 

     return Expression.Lambda<Func<T, bool>>(
      vFilterExpresion, 
      expression.Parameters); 
    } 
Các vấn đề liên quan