如何构建这个复杂的 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)) ||
       );

xMyObject

【问题讨论】:

【参考方案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。让我知道... 我将它用于 IQueryable.Where(...)。但我使用一个 ORMapper 将 where 条件直接转换为 sql。并且使用非编译版本不起作用.. 如果你需要使用Compile()编译,那么你实际上是在使用IEnumerable&lt;T&gt;.Where,这是非常不同的。它编译但不运行,然后告诉我。那会很奇怪。

以上是关于如何构建这个复杂的 Linq 表达式?的主要内容,如果未能解决你的问题,请参考以下文章

基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源

如何构建与通用对象进行比较的 Linq 表达式树?

如何在使用 System.Linq.Dynamic.Core 构建表达式时检查 null

深入LINQ | 揭开IQueryable的面纱

具有匿名类型的 C# LINQ 构建表达式

如何动态构建LINQ