2

我正在使用 GetObject、UpdateObject、DeleteObject 等方法为我的 MVC 应用程序构建存储库层。

这就是我现在所拥有的:

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

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

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

2 回答 2

1

返回 IQueryable 的不利之处在于,如果您曾经有不同的存储库实现,例如使用不同的 ORM,将数据存储在非 SQL 数据库、云或 XML 文件中,则很难实现相同的接口。如果您返回更通用的域对象集合,实现起来会容易得多。例如 IEnumerable。您始终可以传递过滤条件。

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

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

于 2013-03-24T02:48:53.667 回答
0

在这里返回 IQueryable 的好处是您可以继续进一步构建查询而无需访问数据库。一旦您调用 ToList ,它将访问数据库,并且您无法在不再次访问数据库的情况下进一步自定义查询。

于 2013-03-24T02:27:30.653 回答