这个功能真的很不错。ADO.net 数据表中存在类似的功能。这对LinqToSql也很有帮助。当然你会失去强类型检查,但这就是重点,你想要动态搜索。如果您正确处理异常,我真的认为它是一个值得拥有的功能。
您可以考虑向Microsoft Connect添加功能请求。该库已经存在,也许他们会考虑为其添加官方支持。如果您确实提出了功能请求,请确保在此处发布链接,以便我们对其进行投票。Microsoft Connect 具有类似于 stackoverflow 的投票系统。我自己提交了一些LinqtoSql TableUpdate和VB.net Readonly Interfaces like C#。
我记得这个图书馆遇到了一些麻烦。我认为这与静态方法有关。
我发现开发我需要的表达方式会更好。Ilya Builuk 的这篇文章演示了自定义表达式。Ilya 框架的优点在于它在执行 jqGrid 排序等操作时删除了许多样板代码。
在学习表达式的基本概念时,我发现它非常有用。
这段代码的好处是它允许您对 getter 使用点运算符。Person.Age
或者如果你想违反 Demeter,你甚至可以做多个 getter。
代码可以改进。我相信我添加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 }