[问题]你能告诉我如何创建合适的表达式树吗?
[详细] 我静态创建了以下查询,结果符合预期。
// 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)
括号是自动创建的。你无法避免它。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()每个表达式,它将返回创建的代码。了解这一点可以更轻松地创建动态表达式,因为您有能力看到所得到的内容。