我是表达树的新手。
假设我有一个Phrase对象列表,我可以通过调用我创建的一些函数来生成表达式:
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;
还有其他方法来调用表达式而不是我这样做吗?有更标准或传统的方式吗?
提前感谢您提供的任何见解。
答案 0 :(得分:0)
您需要部分创建查询,然后调用fill应用表达式的扩展方法来过滤数据。
IQueryable<Phrase> selectedPhrases=
from p in phrases
select p;
selectedPhrases = selectedPhrases.Where(CreateFilterExpression());
答案 1 :(得分:0)
不,没有办法获取您拥有的Expression
对象,并在查询表达式中将其用作该查询运算符的表达式。您需要使用方法语法。