如何在表达式树中使用括号

shu*_*ch5 3 c# linq lambda

[问题]你能告诉我如何创建合适的表达式树吗?

[详细] 我静态创建了以下查询,结果符合预期。

// Datasource
    string[] dataSource = { "John", "Ken", "Mark", "Mary", "Tom" };

// Keyword for Search
    string[] keywords = { "o", "Mark", "Tom" };


    //LINQ Query (Static)
    var query = dataSource.AsQueryable().
    Where(item =>
   (item.ToLower().Contains(keywords[0].ToLower()) ||
   item.ToLower().Contains(keywords[1].ToLower())) &&
   item.ToLower().Contains(keywords[2].ToLower())).
    OrderByDescending(item => item);


//Result
// "Tom"
Run Code Online (Sandbox Code Playgroud)

条件A|| 条件 B && 条件 C

但我不知道如何用表达式树编写以下条件

(条件A || 条件B) && 条件C

有人告诉我如何在表达式树中使用括号吗?到目前为止,我为 lambda 表达式创建的主体如下,但效果不佳。

public static Expression GetContainsExpression(Expression parameter, string keyword, Expression curBody)
{

    var keywordValue = Expression.Constant(keyword, typeof(string));
      var newBody =
      Expression.Equal( Expression.Call(parameter, ToLower), Expression.Call(keywordValue, ToLower) );

    ///Connect curBody Expression and newBody Expression with "Or" e.s. ||   
    if (curBody != null)
    {
        if (keyword == "Tom")
        {
            return Expression.AndAlso(curBody, newBody);
        }

        else
        return Expression.OrElse(curBody, newBody);
    }
    return newBody;
}
Run Code Online (Sandbox Code Playgroud)

Seb*_*ann 5

括号是自动创建的。你无法避免它。Expression.OrElse orExpression.AndAlso为左和右采用其他表达式,如果它们是组合表达式,则BinaryExpression它们会自动用括号括起来。

看看这段代码:

var paramX = Expression.Parameter(typeof(bool), "x");
var paramY = Expression.Parameter(typeof(bool), "y");
var paramZ = Expression.Parameter(typeof(bool), "z");
var expr = Expression.AndAlso(Expression.OrElse(paramX, paramY), paramZ);
Run Code Online (Sandbox Code Playgroud)

如果你打电话,expr.ToString()你就会得到"((x OrElse y) AndAlso z)"。甚至外部的 AndAlso-Expression 也被包裹在括号中。没有办法删除它们(据我所知)。

一个小提示:您可以调用ToString()每个表达式,它将返回创建的代码。了解这一点可以更轻松地创建动态表达式,因为您有能力看到所得到的内容。