0

我是表达式树的新手。

假设我有一个 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;

除了我的做法之外,还有其他方法可以调用表达式吗?有没有更标准或传统的方式?

提前感谢您提供的任何见解。

4

2 回答 2

0

您需要部分创建查询,然后调用填充应用表达式的扩展方法来过滤数据。

IQueryable<Phrase> selectedPhrases=
    from p in phrases
    select p;

selectedPhrases = selectedPhrases.Where(CreateFilterExpression());
于 2013-10-11T19:00:32.383 回答
0

不,没有办法获取Expression您拥有的对象并在查询表达式中将其用作该查询运算符的表达式。您需要使用方法语法。

于 2013-10-11T19:01:26.820 回答