C# 如何使用表达式树
我不熟悉树木 假设我有一个短语对象列表,我可以通过调用我创建的一些函数生成表达式,如下所示:C# 如何使用表达式树,c#,linq,lambda,C#,Linq,Lambda,我不熟悉树木 假设我有一个短语对象列表,我可以通过调用我创建的一些函数生成表达式,如下所示: ParameterExpression peObject = Expression.Parameter(typeof(Phrase), "type"); var qryAnyKeyWord = GetContainsAnyExpression("Description", keywords.ToArray(), peObject); var qryAuthor = GetEqualsExpression
ParameterExpression peObject = Expression.Parameter(typeof(Phrase), "type");
var qryAnyKeyWord = GetContainsAnyExpression("Description", keywords.ToArray(), peObject);
var qryAuthor = GetEqualsExpression<string>("Author", "jim", peObject);
var qryId = GetLessThanExpression<int>("Id", 4, peObject);
//the above are all binary expressions
var qryCombined = Expression.AndAlso(qryAnyKeyWord, qryAuthor);
qryCombined = Expression.AndAlso(qryCombined, qryId);
Expression<Func<Phrase, bool>> exp = Expression.Lambda<Func<Phrase, bool>>(qryCombined, peObject);
List<Phrase> selectedPhrases = phrases.Where(x => exp.Compile()(x)).ToList();
foreach (Phrase p in selectedPhrases)
show(p);
IEnumerable<Phrase> selectedPhrases=
from p in phrases
where
//use "qryCombined" or "exp" here somehow
select p;
我可以像这样编译和使用结果:
ParameterExpression peObject = Expression.Parameter(typeof(Phrase), "type");
var qryAnyKeyWord = GetContainsAnyExpression("Description", keywords.ToArray(), peObject);
var qryAuthor = GetEqualsExpression<string>("Author", "jim", peObject);
var qryId = GetLessThanExpression<int>("Id", 4, peObject);
//the above are all binary expressions
var qryCombined = Expression.AndAlso(qryAnyKeyWord, qryAuthor);
qryCombined = Expression.AndAlso(qryCombined, qryId);
Expression<Func<Phrase, bool>> exp = Expression.Lambda<Func<Phrase, bool>>(qryCombined, peObject);
List<Phrase> selectedPhrases = phrases.Where(x => exp.Compile()(x)).ToList();
foreach (Phrase p in selectedPhrases)
show(p);
IEnumerable<Phrase> selectedPhrases=
from p in phrases
where
//use "qryCombined" or "exp" here somehow
select p;
Expression=Expression.Lambda(qryCombined,peObject);
列出所选短语=短语。其中(x=>exp.Compile()(x)).ToList();
foreach(所选短语中的短语p)
show(p);
所有这些似乎都很有效
有没有办法在这样的语句中使用这些表达式:
ParameterExpression peObject = Expression.Parameter(typeof(Phrase), "type");
var qryAnyKeyWord = GetContainsAnyExpression("Description", keywords.ToArray(), peObject);
var qryAuthor = GetEqualsExpression<string>("Author", "jim", peObject);
var qryId = GetLessThanExpression<int>("Id", 4, peObject);
//the above are all binary expressions
var qryCombined = Expression.AndAlso(qryAnyKeyWord, qryAuthor);
qryCombined = Expression.AndAlso(qryCombined, qryId);
Expression<Func<Phrase, bool>> exp = Expression.Lambda<Func<Phrase, bool>>(qryCombined, peObject);
List<Phrase> selectedPhrases = phrases.Where(x => exp.Compile()(x)).ToList();
foreach (Phrase p in selectedPhrases)
show(p);
IEnumerable<Phrase> selectedPhrases=
from p in phrases
where
//use "qryCombined" or "exp" here somehow
select p;
IEnumerable selected短语=
从p到短语
哪里
//在这里使用“qryCombined”或“exp”
选择p;
除了我是如何做的,还有其他的方式来调用这些表达式吗?有更标准或更传统的方法吗
提前感谢您提供的任何见解。您需要部分创建查询,然后调用扩展方法填充并应用表达式来过滤数据
IQueryable<Phrase> selectedPhrases=
from p in phrases
select p;
selectedPhrases = selectedPhrases.Where(CreateFilterExpression());
iQuery可选择的短语=
从p到短语
选择p;
selectedPhrases=selectedPhrases.Where(CreateFilterExpression());
否,无法获取您拥有的表达式
对象并在查询表达式中将其用作该查询运算符的表达式。您需要使用方法语法。您的查询语法表达式是noop。你可以把它去掉,他已经在问题本身中使用了方法语法;显然他已经知道怎么做了。他特别询问表达式是否可以在查询语法中使用。AFAIK:您不能合并表达式树,如果您在linq语句中使用它,它将始终是一个调用。这是因为linq语句是在编译时生成的,而您创建的表达式将在运行时创建。为什么要对表达式调用compile
?当您这样做时,您将强制它对对象使用linq,而不是对某些查询提供程序使用linq。如果要这样做,为什么要麻烦处理表达式呢?@Servy所示的示例就是这样,一个查询示例对象列表的示例——在这种情况下没有提供程序。到目前为止,我还没有找到不调用compile就让这些表达式在此实例中工作的方法。@poolboy只需将表达式传递给Where
操作符即可。如果基础IQueryable
对象是一个列表或其他内存中的集合,那么它仍然会解析为linq to对象,但是当您更改基础集合时,它仍然可以正常工作。