2011-12-05 3 views
8
나는 StartsWith, EndsWithContains와 문자열 속성을 필터링하는 유형 Expression<Func<T, bool>>의 발현을 만들 형 Expression<Func<T, string>의 표현을 통과하는 방법을 만들

이 표현과 같은 방법 :<Func을 <T, string>>

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

방법은 보일 것 같은 :

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

FilterType 언급 된 작업 (StartsWith, EndsWith, Contains)

+8

이동하십시오. 우리가 시도한 것을 알려주십시오. 제대로 작동하지 않으면 기꺼이 도와 드리겠습니다. – drdwilcox

답변

7

의 세 가지를 포함하는 열거 형이 시도된다

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

이 답변에 "not null"표현식을 추가했습니다. –

4

감사 @dtb. 잘 작동하고 다음과 같이이 경우 "not null"표현식을 추가했습니다.

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); 
    }