使用IQueryables正确实现Repository Pattern?

时间:2013-03-09 23:51:10

标签: asp.net-mvc web-applications asp.net-mvc-4

我正在使用GetObject,UpdateObject,DeleteObject等方法为我的MVC应用程序构建一个Repository层。

这就是我现在所拥有的:

        public List<Object> GetObjects()
        {
            return _db.Objects.Where(o => o.IsArchived == false).ToList();
        } 

但是我想知道为列表返回IQueryables是否更好,以便在UoW或Service层中应用过滤器时将最少量的数据发送到客户端。做这样的事情最好吗?

            public IQueryable<Object> GetObjects()
            {
                return _db.Objects.Where(o => o.IsArchived == false);
            } 

2 个答案:

答案 0 :(得分:0)

关于返回IQueryable的好处是,您可以继续构建查询,而无需访问数据库。一旦你调用ToList,它就会点击数据库,你无法再次自定义你的查询而不会再次访问数据库。

答案 1 :(得分:0)

返回IQueryable的好处是,如果你有不同的存储库实现,比如说使用不同的ORM,将数据存储在非SQL数据库,云或XML文件中,那么很难实现相同的接口。如果返回更多通用的域对象选择,则实现起来会容易得多。例如IEnumerable。您始终可以通过过滤条件。

返回IQueryable的另一个缺点是,它可能会发生,当您实际运行查询时,您的对象上下文可能已经被处置(取决于您的实现)或者可能在内存中保留的时间超过了所需的时间。

诸如IQueryable之类的漏洞抽象可能会导致问题,例如想象您希望从数据库获取一些数据并通过Guid对其进行排序。如果您在排序之前通过调用ToList()来枚举查询,那么如果您之后执行此操作,则会得到不同的结果。原因是在第一种情况下,排序将在.NET中进行,但在其他情况下,它将在SQL中发生,它使用完全不同的顺序。