Эту функцию было бы очень приятно иметь. Аналогичная функция существует в ADO.net Datatables . Это было бы действительно полезно для LinqToSql . Конечно, вы потеряете строго типизированную проверку, но в этом весь смысл, вы хотите динамический поиск. Если вы правильно обработаете исключения, я действительно считаю, что это особенность, которую стоит иметь.
Возможно, вы захотите добавить запрос функции в Microsoft Connect . Библиотека уже существует, возможно, они рассмотрят возможность добавления официальной поддержки для нее. Если вы делаете запрос на функцию, убедитесь, что вы разместили здесь ссылку, чтобы мы могли проголосовать за нее. Microsoft Connect имеет систему голосования, похожую на stackoverflow. Я сам отправил несколько LinqtoSql TableUpdate и VB.net только для чтения интерфейсов, таких как C # .
Я помню, что у меня были проблемы с этой библиотекой. Я думаю, что это как-то связано со статическими методами.
Я нашел, что лучше разработать выражения, которые мне нужны. Эта статья Ильи Биллюка демонстрирует пользовательские выражения. Хорошая вещь в фреймворке Ильи - он удаляет много стандартного кода при выполнении таких операций, как сортировка для jqGrid.
Я обнаружил, что это чрезвычайно полезно при изучении основных понятий выражений.
Приятной особенностью этого кода является то, что он позволяет использовать операторы точки для геттеров. Person.Age
или если вы хотите нарушить Деметру, вы можете даже сделать несколько геттеров.
Код можно улучшить. Я считаю, что я добавил StartsWith
и разрешил его только для строковых операций, а также для некоторых других поисковых операций. Несмотря на то, что это стоит посмотреть, это помогло мне понять выражения linq.
public static IQueryable<T> Where<T>(this IQueryable<T> query, string column, object value, WhereOperation operation)
{
if (string.IsNullOrEmpty(column))
return query;
ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");
MemberExpression memberAccess = null;
foreach (var property in column.Split('.'))
memberAccess = MemberExpression.Property
(memberAccess ?? (parameter as Expression), property);
//change param value type
//necessary to getting bool from string
ConstantExpression filter = Expression.Constant
(
Convert.ChangeType(value, memberAccess.Type)
);
//switch operation
Expression condition = null;
LambdaExpression lambda = null;
switch (operation)
{
//equal ==
case WhereOperation.Equal:
condition = Expression.Equal(memberAccess, filter);
lambda = Expression.Lambda(condition, parameter);
break;
//not equal !=
case WhereOperation.NotEqual:
condition = Expression.NotEqual(memberAccess, filter);
lambda = Expression.Lambda(condition, parameter);
break;
//string.Contains()
case WhereOperation.Contains:
condition = Expression.Call(memberAccess,
typeof(string).GetMethod("Contains"),
Expression.Constant(value));
lambda = Expression.Lambda(condition, parameter);
break;
}
MethodCallExpression result = Expression.Call(
typeof(Queryable), "Where",
new[] { query.ElementType },
query.Expression,
lambda);
return query.Provider.CreateQuery<T>(result);
}
Перечислитель WhereOperation:
public enum WhereOperation { Equal, NotEqual, Contains }