【发布时间】:2017-01-04 05:52:01
【问题描述】:
最近几天我正在阅读有关存储库模式的信息,每个谈论它的人都不要像这样从存储库中公开 IQueryable(例如 here 和 here):
public interface ICustomersRepository
{
IQueryable<Customer> Customers{ get; }
}
并且为避免这种情况被大量开发人员所接受。
但是当涉及从 UI 过滤大量数据和自定义过滤器时(例如具有 10 多个过滤器选项的报告,用于搜索超过 100 万条记录的数据)是 IQueryable 吗?
特别是当有一个框架并且其他低级开发人员正在使用存储库来开发自定义报告时。他们不能总是将 GetAll 用于此目的。
正如this 或this 等其他线程中提到的,我应该为我的存储库中的每个报告提供方法,并且它们应该返回IEnumerable。以下是我不清楚的地方:
如果我有一个新报告,我必须为此更改我的存储库并添加一个新方法。如果我更改我的存储库,我就违反了Open/Close principle。
这是我的问题:我不想公开 Iqueryable,另一方面,我不想更改每个报告的存储库。
【问题讨论】:
-
不返回 IQueryable,而是取一个,可以用作过滤器。比如
public SomeType[] Get(IQueryable<SomeType> filter)这个好用的var result = someTypeRepo.Get(x => x.Id > 0)。 -
谢谢你,实际上可以轻松工作
-
您也可以采用 IQueryables 来表达您希望包含在结果中的导航属性。
-
@这对我现在有帮助,但毕竟我必须返回所有数据进行过滤
标签: c# entity-framework repository-pattern unit-of-work