首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我应该从DAL返回IEnumerable<T>或IQueryable<T>吗?

我应该从DAL返回IEnumerable<T>或IQueryable<T>吗?
EN

Stack Overflow用户
提问于 2010-06-15 01:06:47
回答 4查看 6.4K关注 0票数 38

我知道这可能是我的观点,但我正在寻找最佳实践。

据我所知,IQueryable<T>实现了IEnumerable<T>,所以在我的DAL中,我目前有如下方法签名:

代码语言:javascript
复制
IEnumerable<Product> GetProducts();
IEnumerable<Product> GetProductsByCategory(int cateogoryId);
Product GetProduct(int productId);

我应该在这里使用IQueryable<T>吗?

这两种方法的优缺点是什么?

请注意,我计划使用Repository模式,因此我将拥有一个如下所示的类:

代码语言:javascript
复制
public class ProductRepository {

    DBDataContext db = new DBDataContext(<!-- connection string -->);

    public IEnumerable<Product> GetProductsNew(int daysOld) {
        return db.GetProducts()
          .Where(p => p.AddedDateTime > DateTime.Now.AddDays(-daysOld ));
    }
}

我应该把我的IEnumerable<T>改成IQueryable<T>吗?其中之一有什么优点/缺点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-15 01:14:46

这取决于你想要什么样的行为。

  • 返回IList告诉调用者他们已经收到了他们已经收到的所有数据IEnumerable告诉调用者他们将需要迭代结果,这可能是懒惰的IQueryable告诉调用者结果得到了可以处理某些类查询的Linq提供程序的支持,从而将形成高性能查询的负担加到了调用者身上。

< requested

  • Returning >F213

虽然后者为调用者提供了很大的灵活性(假设您的存储库完全支持它),但它是最难测试的,而且可以说是最不确定的。

票数 51
EN

Stack Overflow用户

发布于 2010-06-17 11:19:35

还有一件事需要考虑:你的分页/排序支持在哪里?如果您在存储库中提供分页支持,那么返回IEnumerable<T>就可以了。如果您在存储库外部进行分页(如在控制器或服务层中),那么您确实希望使用IQueryable<T>,因为您不希望在分页之前将整个数据集加载到内存中。

票数 8
EN

Stack Overflow用户

发布于 2010-06-15 01:14:00

HUUUUGGGE差异。我经常看到这一点。

您可以在IQueryable访问数据库之前构建它。IQueryable只会在调用eager函数(例如,.ToList())或者您实际尝试提取值时才会访问数据库。IQueryable =懒惰。

IEnumerable将立即对DB执行您的lambda。IEnumerable =渴望。

至于在Repository模式中使用哪种模式,我相信它是迫切需要的。我通常会看到ILists被通过,但其他人需要为你解决这个问题。编辑-您通常会看到IEnumerable而不是IQueryable,因为您不希望图层超过资料档案库A)确定何时发生数据库命中或B)将任何逻辑添加到资料档案库外部的连接中

有一个非常好的LINQ视频,我很喜欢--它不仅仅是IEnumerable v IQueryable,它确实有一些奇妙的洞察力。

http://channel9.msdn.com/posts/matthijs/LINQ-Tips-Tricks-and-Optimizations-by-Scott-Allen/

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3039262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档