Kei*_*ler 55 c# linq iqueryable repository
我正在使用存储库模式进行数据访问,实体框架和LINQ作为非测试存储库实现的基础.我看到的大多数样本在调用返回N个记录而不是List <T>时返回AsQueryable().这样做有什么好处?
Jon*_*len 88
AsQueryable只是创建一个查询,获取列表所需的指令.您可以稍后对查询进行进一步更改,例如添加新的Where子句,这些子句一直发送到数据库级别.
AsList返回包含内存中所有项的实际列表.如果您添加一个新的Where cluse,则不会获得数据库提供的快速过滤.而是获取列表中的所有信息,然后过滤掉应用程序中不需要的内容.
所以基本上它归结为等到最后可能的妈妈才能做出承诺.
Dan*_*ner 23
返回IQueryable<T>
的优点是执行是defferer,直到你真正开始枚举结果,你可以用其他查询组成查询,仍然得到服务器端执行.
问题是您无法在此方法中控制数据库上下文的生命周期 - 您需要一个开放的上下文,并且必须确保它在查询执行之前保持打开状态.然后你必须确保处理上下文.如果返回的结果为List<T>
,T[]
或者类似的东西,你失去递延执行和组成查询的服务器端执行,但你赢得控制权,数据库上下文的寿命.
当然,最合适的是取决于实际要求.这是另一个没有一个真理的问题.
Olm*_*lmo 11
AsQueryable
是一种扩展方法IEnumerable<T>
,可以做两件事:
IEnumerable<T>
工具IQueryable<T>
只是施放,什么都不做.IEnumerable<T>
(EnumerableQuery<T>
),它实现编译lambda并调用Enumerable扩展方法的每个方法.所以在大多数情况下使用AsQueryable是没用的,除非你被迫将IQueryable传递给一个方法,而你有一个IEnumerable,这是一个黑客.
注意:AsQueryable是一个黑客,IQueryable当然不是!