2013-07-18 3 views
0

나는 하나의 호출에서 다음의 세 가지 수행하는 방법을 알아내는 힘든 시간을 보내고있어이 int32 : 수행 할Linq에 동적 필드 포함하고

  1. 사용 .Contains 메소드를 "LIKE 나는 그것에 .Contains을 할 수 있도록 "내 SQL 서버
  2. 에 대한 작업은 ((
  3. 그렇게 SqlFunctions.StringConvert 같은 것을 사용하여, 사용자가 사용자 정의 필드 이름을 전달할 수 있도록 문자열로 INT32에서 값을 변환 double) d.ID) .Contains (idSearch)가 작동하지 않습니다. 나는 내가 어떤 열을 검사 할 것인지 전혀 모른다.

바람직하게는, 나는 같은 것을 할 싶습니다

public static class LinqExtensions 
{ 
    public static IQueryable<T> Like<T>(this IQueryable<T> source, string fieldName, object value) 
    { 
     ... Code here 
    } 
} 

를 내가이 처리하는 식 트리를 사용할 필요가 있다고 생각,하지만 난 정말 힘든 시간을 어떤 자습서를 찾는 데있어 동적 Linq/표현식 트리를 사용하는 방법. 어떤 아이디어 나 링크를 통해 나를 도와 주시면 감사하겠습니다. 또는 이미이 작업을 수행하는 라이브러리가있는 사람이라면 더 좋을 것입니다. 좋아

public static class LinqExtensions 
{ 
    public static IQueryable<T> Like<T>(this IQueryable<T> source, string propertyName, object value) 
    { 
     IQueryable<T> returnQuery = null; 
     switch (value.GetType().ToString()) 
     { 
      case "System.String": 
       returnQuery = source.Where(LikeLambdaString<T>(propertyName, value.ToString())); 
       break; 
      default: 
       returnQuery = source.Where(LikeLambdaDouble<T>(propertyName, Convert.ToDouble(value))); 
       break;   
     } 

     return returnQuery; 
    } 

    public static Expression<Func<T, bool>> LikeLambdaString<T>(string propertyName, string value) 
    { 
     var linqParam = Expression.Parameter(typeof(T), propertyName); 
     var linqProp = GetProperty<T>(linqParam, propertyName); 

     var containsFunc = Expression.Call(linqProp, 
      typeof(string).GetMethod("Contains"), 
      new Expression[] { Expression.Constant(value) }); 

     return Expression.Lambda<Func<T, bool>>(containsFunc, 
       new ParameterExpression[] { linqParam }); 
    } 

    public static Expression<Func<T, bool>> LikeLambdaDouble<T>(string propertyName, double? value) 
    { 
     string stringValue = (value == null) ? string.Empty : value.ToString(); 
     var linqParam = Expression.Parameter(typeof(T), propertyName); 
     var linqProp = GetProperty<T>(linqParam, propertyName); 

     var stringConvertMethodInfo = 
      typeof(SqlFunctions).GetMethod("StringConvert", new Type[] { typeof(double?) }); 

     var stringContainsMethodInfo = 
      typeof(String).GetMethod("Contains"); 

     return Expression.Lambda<Func<T, bool>>(
      Expression.Call(Expression.Call(
        stringConvertMethodInfo, 
        Expression.Convert(
         linqProp, 
         typeof(double?))), 
       stringContainsMethodInfo, 
       Expression.Constant(stringValue)), 
      linqParam); 
    } 

    public static MemberExpression GetProperty<T>(ParameterExpression linqParam, string propertyName) 
    { 
     List<string> propertyNames = propertyName.Split('.').ToList(); 

     var linqProp = Expression.Property(linqParam, propertyNames[0]); 

     for (int i = 1; i < propertyNames.Count(); i++) 
     { 
      linqProp = Expression.Property(linqProp, propertyNames[i]); 
     } 

     return linqProp; 
    } 

}

을 당신이 그것을 부를 것이다 : :

returnQuery = returnQuery.Like("ID", doubleValue); 
다음

답변

0

은 내가 INT32에 LIKE를 수행하는 쓴 확장 방법이다