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

时间:2015-06-19 00:22:13

标签: 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"

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

但我不知道如何使用表达式树

编写以下条件

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

有没有人告诉我如何在表达式树中使用parethesis? 到目前为止,我为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;
}

1 个答案:

答案 0 :(得分:1)

parethesis是自动创建的。你无法避免它。 Expression.OrElseExpression.AndAlso左侧和右侧使用另一个表达式,如果它们是BinaryExpression的组合表达式,则它们会自动包裹在parethesis中。

看一下这段代码:

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);

如果您致电expr.ToString(),您将获得"((x OrElse y) AndAlso z)"。甚至外部的AndAlso-Expression也被包裹在parethesis中。没有办法删除它们(据我所知到目前为止)。

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