我进入使用与数据访问存储库模式实体框架和LINQ为实施非测试存储库的基础。 我看大多数样品返回AsQueryable已()在调用返回N条记录而不是List <T>。 什么是这样做的好处?
Answer 1:
AsQueryable已只是创建一个查询,以获取列表所需的指令。 您可以对查询futher更改,如添加该送送一路下跌到数据库级新Where子句后。
AsList返回与内存中的所有项目的实际列表。 如果你添加一个新的凡cluse它,你没有得到快速过滤数据库提供。 相反,你得到列表中的所有信息,然后筛选出你不要在应用程序的需要。
因此,基本上可以归结为表达之前等待直到最后可能momment。
Answer 2:
返回IQueryable<T>
的优点,即执行是defferer,直到你真正开始列举的结果,您可以与其他查询组成的查询,仍然可以得到服务器端执行。
问题是你无法控制的数据库上下文的寿命在此方法 - 你需要一个开放的背景下,必须确保直到查询被执行其打开。 然后,你必须确保上下文将被布置。 如果返回的结果作为List<T>
T[]
或类似的东西,你松递延执行和由查询的服务器侧执行,但你赢控制数据库上下文的寿命。
什么最适合,当然,取决于实际需求。 这是没有一个单一的真相另一个问题。
Answer 3:
AsQueryable
是一个扩展方法IEnumerable<T>
可以做两件事情:
- 如果
IEnumerable<T>
实现IQueryable<T>
甫一铸件,无所事事。 - 否则创建一个“假”
IEnumerable<T>
EnumerableQuery<T>
实现每个方法编译lambdas和调用到可枚举扩展方法。
因此,在大多数的使用AsQueryable已是无用的,除非ü被迫到的IQueryable传递给方法和u有一个IEnumerable的代替的情况下,这是一个黑客。
注:AsQueryable已是一个黑客,当然IQueryable的是不是!
Answer 4:
返回IQueryable<T>
直到其结果实际使用将推迟查询的执行。 在此之前,也可以在执行其他数据库查询操作IQueryable<T>
; 在List
你只限于一般效率低的内存操作。
文章来源: Why use AsQueryable() instead of List()?