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);
"yardımcı fonksiyonları" Yani olan [ 'SqlMethods'] (http://msdn.microsoft.com/en-us/library/system. data.linq.sqlclient.sqlmethods.aspx) - özellikle 'Like()' –
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. –
@Craig teşekkürler; Bunu bilmiyordum. –