我已经看到很多项目的存储库返回的实例IQueryable
。这允许其他过滤器,并且可以IQueryable
通过其他代码对进行排序,从而转换为正在生成的不同SQL。我很好奇这种模式的来源以及它是否是一个好主意。
我最大的担心是,一个IQueryable
被枚举的承诺会在一段时间后打入数据库。这意味着将向存储库外部抛出错误。这可能意味着在应用程序的不同层中引发了Entity Framework异常。
过去,我也遇到过多个活动结果集(MARS)的问题(尤其是在使用事务时),这种方法听起来更容易导致这种情况的发生。
我总是在每个LINQ表达式的末尾调用AsEnumerable
或ToArray
,以确保在离开存储库代码之前已命中数据库。
我想知道返回IQueryable
是否可用作数据层的构建块。我已经看到一些相当奢侈的代码,其中一个存储库调用另一个存储库以构建更大的代码IQueryable
。
where
在deferred中添加了子句IQueryable
,则只需通过网络发送该数据,而不是整个结果集。