Linq IQueryable有什么大不了的?

Linq IQueryable有什么大不了的?,linq,architecture,collections,Linq,Architecture,Collections,我看到很多人在谈论IQueryable,但我还没有完全理解所有的嗡嗡声是关于什么的。我总是使用genericList,发现它们非常丰富,您可以“查询”它们并使用它们,甚至对它们运行LINQ查询 我想知道是否有很好的理由开始考虑在我的项目中使用不同的默认集合。通过IQueryable接口,您可以通过多个步骤定义针对远程LINQ提供程序(通常针对数据库,但不必如此)的部分查询,并延迟执行 例如,您的数据库层可以通过在查询中添加.Where(x=>x……)子句来定义一些限制(例如基于权限、安全性-无论

我看到很多人在谈论
IQueryable
,但我还没有完全理解所有的嗡嗡声是关于什么的。我总是使用generic
List
,发现它们非常丰富,您可以“查询”它们并使用它们,甚至对它们运行LINQ查询


我想知道是否有很好的理由开始考虑在我的项目中使用不同的默认集合。

通过
IQueryable
接口,您可以通过多个步骤定义针对远程LINQ提供程序(通常针对数据库,但不必如此)的部分查询,并延迟执行

例如,您的数据库层可以通过在查询中添加
.Where(x=>x……)
子句来定义一些限制(例如基于权限、安全性-无论什么)。但这还没有执行——例如,您没有检索到与该条件匹配的150000行

相反,您将
IQueryable
接口传递到下一个级别,即业务层,在该层中,您可能会向查询中添加额外的需求和where子句—同样,现在还没有执行任何操作,您也没有丢弃检索到的15万行中的8万行—您只是定义了额外的查询条件

UI层也可以做同样的事情,例如,基于用户在表单中的输入

神奇的是,您正在通过所有层传递
IQueryable
接口,向其添加额外的临界值-但在您实际强制执行之前,它不会被执行/评估。这也意味着您不会不必要地选择和检索大量数据,这些数据最终会被丢弃


你不能用一个经典的静态列表做到这一点-你必须选择数据,可能在以后的过程中再次丢弃很多数据-毕竟你有一个静态列表

IQueryable允许您使用LINQ进行查询,就像LINQ到对象查询一样,查询实际上是“编译”并在其他地方运行的

最常见的实现是针对数据库的。如果使用
List
和LINQ to对象,则将整个数据“表”加载到内存中,然后对其运行查询

通过使用
IQueryable
,LINQ提供可以将LINQ语句“翻译”为实际的SQL代码,并在数据库上运行它。结果可以返回给您并进行枚举


这是非常非常有效的,特别是当您在N层系统中工作时。

针对
IEnumerable
的LINQ查询产生委托(方法),调用委托时,委托(方法)将执行所述查询


LINQ查询
IQueryable
product,一种表示生成查询的代码的数据结构。LINQ提供程序(如LINQtoSQL)解释这些数据结构,在目标平台上生成相同的查询(本例中为T-SQL)

有关编译器如何根据
IQueryable
解释查询语法的示例,请参阅我对该问题的回答:


IQueryable
列表
有着根本的不同——两者都有各自的用途。