C# 我需要确认我对IQueryable&;数不清

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()

IQueryable 据我所知,在linqtosql&Object中,在执行查询之前,我可以添加更多表达式

在本例中,当我尝试执行Query2时,query1和Query2成为最终查询。我说得对吗? 或者如果“数字”是DB,我是对的

    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?