IQueryable有什么大不了的?

jjr*_*527 16 linq architecture collections

我见过很多人都在谈论IQueryable,我还没有完全了解所有的嗡嗡声.我总是使用泛型List,并发现它们非常丰富,你可以"查询"它们并使用它们,甚至对它们运行LINQ查询.

我想知道是否有充分的理由开始在我的项目中考虑不同的默认集合.

mar*_*c_s 48

IQueryable接口允许您在多个步骤中使用延迟执行来针对远程LINQ提供程序(通常针对数据库,但不一定是)定义查询的各个部分.

例如,您的数据库层可以通过向.Where(x => x.......)查询添加子句来定义一些限制(例如,基于权限,安全性等).但是这还没有被执行 - 例如,你没有检索符合该标准的150'000行.

相反,你传上来IQueryable接口到一个新的水平,业务层,在那里你可能会增加额外的要求和where子句来查询-再次,没有得到执行,只是还没有,你也没有折腾出的80,000你您检索的150'000行 - 您只是定义了其他查询条件.

并且UI层可以做同样的事情,例如基于表单中的用户输入或者某种东西.

神奇之处在于,您将IQueryable界面传递到所有图层,为其添加了额外的评论 - 但在实际强制执行之前,它不会被执行/评估.这也意味着您不必在不必要地选择和检索大量数据,之后您最终会丢弃这些数据.

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


Ree*_*sey 10

IQueryable允许您使用LINQ进行查询,就像LINQ to Object查询一样,查询实际上是"编译"并在其他地方运行.

最常见的实现适用于数据库.如果您使用List<T>LINQ to Objects,则将整个"数据表"加载到内存中,然后针对它运行查询.

通过使用IQueryable<T>,LINQ提供可以将您的LINQ语句"转换"为实际的SQL代码,并在数据库上运行它.结果可以返回给您并枚举.

这非常有效,特别是如果您在N-Tiered系统中工作.


Bry*_*tts 5

针对IEnumerable<T>生产委托(方法)的LINQ查询,该委托在调用时执行所描述的查询。

LINQ针对IQueryable<T>产生表达式树进行查询,这是一种表示产生查询的代码的数据结构。诸如LINQ to SQL之类的LINQ提供程序解释这些数据结构,从而在目标平台(在这种情况下为T-SQL)上生成相同的查询。

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

基于组合框值构建动态LINQ查询