2010-10-13 13 views
6

Linq sorgularını dinamik olarak dize değerleri kullanarak filtrelemek için bir Linq uzantısı yöntemim var. Örneğin: query.WhereHelper("columName", ">", 1). GreaterThan veya NotEqual vb. Gibi pek çok farklı filtre operatörü kullanabilirim, ancak "Beğen" gibi. Expression.Like veya Expression.StartsWith vb. Yoktur. Like işlecini Expression ağacıma nasıl uygularım? İşte benim kod:İfade Ağacı'nda işleç gibi

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

cevap

7

Sen string.StartsWith, string.Contains, string.EndsWith vb yöntemlerle Expression.Call kullanmak. Tüketici kodunun TSQL'ye geri çevrilmesidir. LINQ-to-SQL için, burada bazı ek yardım işlevleri de vardır, ancak EF ile değil.

aşağıdaki gibi ifade GİBİ tanımlayabilir
+1

"yardımcı fonksiyonları" Yani olan [ 'SqlMethods'] (http://msdn.microsoft.com/en-us/library/system. data.linq.sqlclient.sqlmethods.aspx) - özellikle 'Like()' –

+1

EF ile ilgili yorum yanlıştır. L2S için "SqlMethods" için anonim olan [EntityFunctions] (http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.aspx) var. Ancak, 'EndsWith' ve' Contains' gibi işlevler, EF’de doğal olarak desteklenir ve bu tür yardımcılara ihtiyaç duymaz. –

+0

@Craig teşekkürler; Bunu bilmiyordum. –

6

,

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

Test edilmiş ve düzgün çalışıyor, günümü kurtardın! – GiveEmTheBoot

İlgili konular