[问题] 你能告诉我如何创建合适的表达式树吗?
[详细] 我静态创建了以下查询,结果如预期。
// 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;
}
答案 0 :(得分:1)
parethesis是自动创建的。你无法避免它。 Expression.OrElse
或Expression.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()
,它将返回创建的代码。了解这一点可以更容易地创建动态表达式,因为您只有很小的能力来查看所获得的内容。