C# 我需要确认我对IQueryable&;数不清
IQueryable 据我所知,在linqtosql&Object中,在执行查询之前,我可以添加更多表达式 在本例中,当我尝试执行Query2时,query1和Query2成为最终查询。我说得对吗? 或者如果“数字”是DB,我是对的C# 我需要确认我对IQueryable&;数不清,c#,ienumerable,iqueryable,C#,Ienumerable,Iqueryable,IQueryable 据我所知,在linqtosql&Object中,在执行查询之前,我可以添加更多表达式 在本例中,当我尝试执行Query2时,query1和Query2成为最终查询。我说得对吗? 或者如果“数字”是DB,我是对的 int[] Numbers= new int[] { 1, 2, 3, 4 }; IQueryable<int> Query1 = from X in Numbers.AsQueryable()
int[] Numbers= new int[] { 1, 2, 3, 4 };
IQueryable<int> Query1 = from X in Numbers.AsQueryable()
where X > 1
select X;
IQueryable<int> Query2 = from X in Query1
where X > 2
select X;
//if I do this: Query2.Count() -> before it executes this, those two queries become one query (FinalQuery)?
IQueryable<int> FinalQuery = from X in Query2
where X > 2
select X;
int[]Numbers=新的int[]{1,2,3,4};
IQueryable Query1=从数字中的X开始。AsQueryable()
其中X>1
选择X;
IQueryable Query2=来自Query1中的X
其中X>2
选择X;
//如果我这样做:Query2.Count()->在它执行此操作之前,这两个查询将成为一个查询(FinalQuery)?
IQueryable FinalQuery=来自查询2中的X
其中X>2
选择X;
但是,如果我使用IEnumerable,它会执行Query1并得到一个IEnumerable吗。然后它将执行Query2并得到最终的IEnumerable;它会执行2个查询吗?在您尝试实际使用结果之前,IEnumerable和IQueryable LINQ查询都不会执行。它们都只是包含同名扩展方法的类。但它们都“懒惰”,因为它们返回新的查询,而不是实际结果 一般的区别是IEnumerable使用Funcs(本质上是委托)作为查询的底层存储,而IQueryable使用表达式树(例如,可以将查询“转换”为SQL) 如果我使用IEnumerable,它会执行Query1并得到一个IEnumerable。然后它将执行Query2并得到最终的IEnumerable 对。但是它们将被串联执行,每个数字
X
将通过两个查询“流动”。这被称为“延迟评估”或“延迟执行”
它会执行两个查询吗
对。时间重叠
[使用IQueryable]在执行此操作之前,这两个查询将成为一个查询(FinalQuery)
没有
IQueryable
和IEnumerable
会发生完全相同的事情。没有任何“智能”组件会优化,其中X>1
。我没有说它会在使用结果之前执行。看看这个例子,我写了一行->Query2.Count()。所以我问这两个查询是否成为一个查询-最终查询。“我说得对吗?”斯塔瓦菲说,我不太明白。运行Query2.Count()将得到一个int结果,但不会以任何方式更改Query2,因为它们是不可变的。这就是你要问的吗?我很难理解我自己。我很抱歉浪费了你的时间。我希望其他人能理解。再次感谢您的时间。@Erix我想要问的是,如果在到达最终查询行之前执行查询2(如.ToList),那么FinalQuery
表达式的结果是否会有所不同当执行q2时,它是否会转换为类似FinalQuery的结果,然后转换为SQL?