Ответ 1
Эта функция будет очень приятной. Аналогичная функция существует в ADO.net Datatables. Это было бы действительно полезно для LinqToSql. Конечно, вы потеряете строго типизированную проверку, но в этом весь смысл, вы хотите динамический поиск. Если вы правильно справляетесь с исключениями, я действительно думаю, что его ценность стоит иметь.
Возможно, вы захотите добавить запрос функции в Microsoft Connect. Библиотека уже существует, возможно, они рассмотрят возможность добавления официальной поддержки для нее. Если вы сделаете запрос на функцию, убедитесь, что вы разместили ссылку здесь, чтобы мы могли проголосовать за нее. Система Microsoft Connect имеет систему голосования, похожую на stackoverflow. Я представил несколько из них LinqtoSql TableUpdate и VB.net Readonly Интерфейсы, такие как С#.
Я помню, что у меня были проблемы с этой библиотекой. Я думаю, что это как-то связано со статическими методами.
Мне было лучше разработать нужные мне выражения. Эта статья статьи Илья Буйлук демонстрирует пользовательские выражения. Самое приятное, что в Ilya framework он удаляет много кода шаблона при выполнении операций, таких как сортировка для 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 }