2010-10-13 16 views
6

Mam metodę rozszerzenia Linq do dynamicznego filtrowania kwerend Linq za pomocą wartości ciągu. Na przykład: query.WhereHelper("columName", ">", 1). Mógłbym używać wielu różnych operatorów filtrów, takich jak GreaterThan lub NotEqual itp., Ale nie "Like". Nie ma Expression.Like ani Expression.StartsWith itp. Jak mogę zaimplementować operator Like do mojego drzewa Expression? Oto mój kod:Podobnie jak operator w drzewie wyrażeń

public static IQueryable<T> WhereHelper<T>(this IQueryable<T> source, string columnName, object value, string filterType) 
{ 
    ParameterExpression table = Expression.Parameter(typeof(T), ""); 
    Expression column = Expression.PropertyOrField(table, columnName); 
    Expression valueExpression = Expression.Convert(Expression.Constant(value), column.Type); 
    Expression where = null; 

    switch (filterType) 
    { 
     case "<": 
      where = Expression.LessThan(column, valueExpression); 
      break; 
     case "<=": 
      where = Expression.LessThanOrEqual(column, valueExpression); 
      break; 
     case "=": 
      where = Expression.Equal(column, valueExpression); 
      break; 
     case ">": 
      where = Expression.GreaterThan(column, valueExpression; 
      break; 
     case ">=": 
      where = Expression.GreaterThanOrEqual(column, valueExpression); 
      break; 
     case "<>": 
      where = Expression.NotEqual(column, valueExpression); 
      break; 
    } 

    Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table }); 

    Type[] exprArgTypes = { source.ElementType }; 

    MethodCallExpression methodCall = Expression.Call(typeof(Queryable), 
                 "Where", 
                 exprArgTypes, 
                 source.Expression, 
                 lambda); 

    return (IQueryable<T>)source.Provider.CreateQuery<T>(methodCall); 

Odpowiedz

7

byłoby użyć Expression.Call z string.StartsWith, string.Contains, string.EndsWith itp metodach. Kod zużywający powinien przetłumaczyć go z powrotem do TSQL. Zauważ, że dla LINQ-SQL istnieją tu również dodatkowe funkcje pomocnicze, ale nie EF.

+1

"funkcje pomocnicze" Znaczy to [ 'SqlMethods'] (http://msdn.microsoft.com/en-us/library/system. data.linq.sqlclient.sqlmethods.aspx) - w szczególności 'Like()' –

+1

Komentarz na temat EF jest niepoprawny. Istnieje [EntityFunctions] (http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.aspx), który jest analagiczny dla 'SqlMethods' dla L2S. Jednak funkcje takie jak 'EndsWith' i' Contains' są natywnie obsługiwane w EF i nie wymagają takich pomocników. –

+0

@Craig thanks; Nie wiedziałem o tym. –

6

można zdefiniować następująco LIKE ekspresji,

var propertyName = "Firstname"; 
var propertyValue= "xxxx"; 

MethodInfo refmethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
var parameter = Expression.Parameter(typeof(T), "type"); 
var property = Expression.Property(parameter, propertyName); 
var value = Expression.Constant(propertyValue, typeof(string)); 
var containsMethodExp = Expression.Call(property, refmethod, value); 
+0

Sprawdzone i działa prawidłowo Zapisałeś mój dzień! Dziękujemy! – GiveEmTheBoot

Powiązane problemy