Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用表达式树_C#_Linq_Lambda - Fatal编程技术网

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对象,但是当您更改基础集合时,它仍然可以正常工作。