如何使用表达式树

时间:2013-10-11 18:57:36

标签: c# linq lambda

我是表达树的新手。

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

还有其他方法来调用表达式而不是我这样做吗?有更标准或传统的方式吗?

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

2 个答案:

答案 0 :(得分:0)

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

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

selectedPhrases = selectedPhrases.Where(CreateFilterExpression());

答案 1 :(得分:0)

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