Linq 不';t IQueryable.Expression=表达式常数(this);导致无限循环?
表达式树表示树状数据结构中的代码,其中每个节点都是一个表达式。在Linq中,Linq提供者使用它们将它们转换为目标进程的本机语言 我对表达式树知之甚少,但我一直在阅读下面的代码,作者使用Linq 不';t IQueryable.Expression=表达式常数(this);导致无限循环?,linq,Linq,表达式树表示树状数据结构中的代码,其中每个节点都是一个表达式。在Linq中,Linq提供者使用它们将它们转换为目标进程的本机语言 我对表达式树知之甚少,但我一直在阅读下面的代码,作者使用expression.Constant(this)来描述初始查询。因此,根据作者Expression.Constant(this)应该使提供者能够检索someQuery的初始元素序列 但据我所知,这应该会导致一个无限循环,因为someQuery.expression中的表达式树描述的是someQuery对象,而不
expression.Constant(this)
来描述初始查询。因此,根据作者Expression.Constant(this)
应该使提供者能够检索someQuery
的初始元素序列
但据我所知,这应该会导致一个无限循环,因为someQuery.expression
中的表达式树描述的是someQuery
对象,而不是查询本身的细节(或者换句话说,如果目标平台是SQL DB,expression.Constant(这)
没有用非sql术语描述查询应从数据库中检索哪些行或表)。因此,当提供者查看someQuery.Expression
时,它只会找到someQuery
对象的描述D。如果它进一步检查D.Expression属性的详细信息,它会再次找到someQuery
对象的描述,依此类推–因此无限循环:
public class Query<T> : IQueryable<T>...
{
QueryProvider provider;
Expression expression;
public Query(QueryProvider provider) {
this.provider = provider;
this.expression = Expression.Constant(this);
}
...
}
Query<string> someQuery = new Query<string>();
公共类查询:IQueryable。。。
{
查询提供者;
表达;
公共查询(QueryProvider提供程序){
this.provider=提供者;
this.expression=表达式常数(this);
}
...
}
Query someQuery=newquery();
谢谢我希望提供者了解查询类型,并且知道当它碰到类型为
query
的常量表达式时,它实际上碰到了一片叶子。迟早,提供者必须得到描述“整个表”的内容或等效内容。当然,查询
需要关于哪个表等的信息,但在一个完整的示例中,我希望它能提供这些信息
(出于兴趣,我是问题的作者吗?我在C#Depth中写了一些非常类似的东西…不,是从下面的链接。我还没有读完整篇文章,但我认为Query没有任何关于表数据应该来自哪个方面的信息—您能检查一下并报告吗;)。出于好奇,您的书中的查询示例是否有描述“整个表”的“某物”?@user702769:在这种情况下,您可以将
表
本身作为查询提供程序-查询
仍然有对提供程序的引用,因此它可以通过这种方式返回到根目录。我不记得我的C#Depth小样本做了什么……但底线是,该查询应该有一些关于它应该检索的表和行的信息——也许是以属性的形式?!不管怎么说,我提供的链接中的代码没有类似的内容,所以我觉得我仍然缺少一些非常明显的东西?!2-“您可以将表本身设置为QueryProvider-查询仍然有对提供程序的引用,因此它可以通过这种方式返回到根目录。”抱歉,这超出了我的理解范围。查询是否已表示数据库中的表?你是说除了查询之外,我们还可以有一个表对象,它将描述DB表(以及该表中的特定行),并且也是一个提供者?我是说查询
有一个对创建它的提供者的引用-该提供者可以拥有所需的所有信息。