Dav*_*ter 31 c# linq dynamic-linq linq-expressions
我正在寻找一些搜索例程使用LINQ,并希望有一些动态where子句.因此,例如,如果用户想要按城市搜索或按州搜索,我会有一个动态LINQ Where <>调用而不是创建两个强类型LINQ表达式,然后根据用户想要搜索的方式使用适当的LINQ表达式.
所以我想这样做:
String criteria="p.City='Pittsburgh'"; //or "p.State='PA'"
personData.Where(criteria)
Run Code Online (Sandbox Code Playgroud)
代替
personData.Where(p => p.City=="Pittsburgh");
要么
personData.Where(p => p.State=="PA");
我看到Scott Guthrie在Visual Studio 2008样本中谈论Dynamic LINQ 的博客文章.这似乎做我想要的,但我的问题是:
提前致谢!
小智 6
这个功能真的很棒.ADO.net Datatables中存在类似的功能.这对LinqToSql也很有帮助.当然你会失去强类型检查,但这就是重点,你想要动态搜索.如果你正确处理异常我真的认为它是一个值得拥有的功能.
你可能会考虑增加一个功能请求到Microsoft连接.图书馆已经存在,也许他们会考虑增加对它的官方支持.如果您确实发出了功能请求,请确保在此处发布链接,以便我们对其进行投票.Microsoft Connect具有类似于stackoverflow的投票系统.我已经提交了一些自己的LinqtoSql TableUpdate和VB.net Readonly Interfaces,比如C#.
我记得在这个库中遇到了一些麻烦.我认为它与静态方法有关.
我发现开发我需要的表达式更好.Ilya Builuk的这篇文章演示了自定义表达式.关于Ilya框架的好处是它在执行像jqGrid的排序操作时删除了很多样板代码.
在了解表达式的基本概念时,我发现它非常有用.
这段代码的好处是它允许你使用点运算符作为getter.Person.Age或者如果你想违反Demeter,你甚至可以做多个吸气剂.
代码可以改进.我相信我添加了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);
}
Run Code Online (Sandbox Code Playgroud)
WhereOperation枚举器:
public enum WhereOperation { Equal, NotEqual, Contains }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21547 次 |
| 最近记录: |