如何构建这个复杂的 Linq 表达式?
Posted
技术标签:
【中文标题】如何构建这个复杂的 Linq 表达式?【英文标题】:How to build this complex Linq expression? 【发布时间】:2009-09-16 08:54:55 【问题描述】:我想从字符串列表构建一个 System.Linq.Expression,如下所示:
System.Linq.Expressions.Expression x = null;
foreach (string s in GetWords(input))
/* Create Expression */
所以我可以使用:
.Where(x =>
x.Name.Like(string.Format("%0%", word1)) ||
x.Name.Like(string.Format("%0%", word2)) ||
x.Name.Like(string.Format("%0%", word3)) ||
x.Id.ToString().Like(string.Format("%0%", word1)) ||
x.Id.ToString().Like(string.Format("%0%", word2)) ||
x.Id.ToString().Like(string.Format("%0%", word3)) ||
);
x
是MyObject
【问题讨论】:
【参考方案1】:类似:
string[] words = "foo", "bar", "blop" ; // your data
Expression body = null;
var param = Expression.Parameter(typeof(SomeType), "x");
var id = Expression.PropertyOrField(param, "Id");
var name = Expression.PropertyOrField(param, "Name");
foreach (string word in words)
var wordExpr = Expression.Constant(word, typeof(string));
var wordTest = Expression.OrElse(
Expression.Call(id, "Contains", null, wordExpr),
Expression.Call(name, "Contains", null, wordExpr));
body = body == null ? wordTest : Expression.OrElse(body, wordTest);
Expression<Func<SomeType,bool>>lambda;
if (body == null) lambda = x => false;
else lambda = Expression.Lambda<Func<SomeType, bool>>(body, param);
【讨论】:
仅当您使用 LINQ-to-Objects 时;字节你问如何获得一个表达式(这是上面所做的),而不是一个委托(这是Compile()
所做的)。如果您只是使用 LINQ-to-Objects,则有更好的方法不涉及Expression
。让我知道...
我将它用于 IQueryableCompile()
来编译,那么你实际上是在使用IEnumerable<T>.Where
,这是非常不同的。它编译但不运行,然后告诉我。那会很奇怪。以上是关于如何构建这个复杂的 Linq 表达式?的主要内容,如果未能解决你的问题,请参考以下文章
基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源