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);
"funkcje pomocnicze" Znaczy to [ 'SqlMethods'] (http://msdn.microsoft.com/en-us/library/system. data.linq.sqlclient.sqlmethods.aspx) - w szczególności 'Like()' –
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. –
@Craig thanks; Nie wiedziałem o tym. –