2012-07-20 3 views
0
static class QueryableExtensions 
{ 
private static MethodInfo StringContainsMethod; 
private static MethodInfo StringStartsWithMethod; 
static QueryableExtensions() 
{ 
    Type[] singleStringParam = new[] { typeof(string) }; 
    StringContainsMethod = typeof(string).GetMethod("Contains", singleStringParam); 
    StringStartsWithMethod = typeof(string).GetMethod("StartsWith", singleStringParam); 
} 
public static IQueryable<T> AppendTextFilter<T>(this IQueryable<T> queryable, Expression<Func<T, string>> memberSelector, string condition, string value) 
{ 
    Expression expression = null; 
    switch (condition) 
    { 
     case "StartsWith": 
      expression = Expression.Call(memberSelector.Body, StringStartsWithMethod, Expression.Constant(value)); 
      break; 
     case "Equals": 
      expression = Expression.Equal(memberSelector.Body, Expression.Constant(value)); 
      break; 
     case "Contains": 
      expression = Expression.Call(memberSelector.Body, StringContainsMethod, Expression.Constant(value)); 
      break; 
     default: 
      throw new NotSupportedException(string.Format("'{0}' is not a supported condition", condition)); 
    } 
    var lambda = Expression.Lambda<Func<T, bool>>(expression, memberSelector.Parameters); 
    return queryable.Where(lambda); 
} 
} 

Google에서 검색 할 때 클래스보다 높습니다. 글쎄, 정말 많이 도움이 되긴하지만 여전히 내 필요를 충족시킬 수는 없습니다.
문제는 "string"유형의 필드 만 처리 할 수 ​​있다는 것입니다. 위의 블록 코드에서 보았 듯이 메서드는 T, string 만 처리 할 수 ​​있습니다.
단일 메서드 내에서 원하는 모든 유형을 처리하는 방법은 무엇입니까?dynamic linq express를 구성하십시오

답변

0

글쎄,이 방법은 문자열을 제네릭 유형으로 대체하는 것입니다.

public static IQueryable<T> AppendTextFilter<T, TValue>(
     this IQueryable<T> queryable, 
     Expression<Func<T, TValue>> memberSelector, 
     string condition, 
     TValue value) 

하지만 당신의 샘플

, 이것은 널 아주 아닙니다 감사합니다, 예를 들어, 단지

+0

음 ... TValue 유형 string 경우 적용 할 수 StartsWith로, 많은 이해가되지 않습니다 사전 Value.It에 익숙한 정말 날 도와. – user1539984

+0

@ user1539984 사전 값? 무슨 소리 야? –

+0

오류가 있습니다. 사전 유형이어야합니다. – user1539984