【发布时间】:2012-08-11 11:15:56
【问题描述】:
我正在构建一个存储库,我在很多地方都看到了不将 IQueryable 暴露在存储库之外的两个原因。
1) 首先是因为不同的 LINQ 提供程序的行为可能不同,而这种差异应该包含在存储库中。
2) 二是防止服务级别开发人员修改数据库查询,以免意外导致性能问题。
我想问题 2 只能通过将所有查询逻辑保留在存储库中并且不允许任何形式的外部查询构建来防止?但这对我来说似乎有点不切实际。
问题 1 似乎可以通过使用数据对象模式来解决。
例如public IEnumerable<T> FindBy(Query query)
我的问题是,为什么我不只是传递一个 lambda 表达式,因为它独立于提供程序,似乎为我提供了与查询对象相同的功能和相同级别的分离?
例如public IEnumerable<T> FindBy(Expression<Func<T,bool>> predicate)
有什么理由不这样做吗?它是否违反了某些规则?最佳实践?我应该知道什么?
【问题讨论】:
-
我有一个 repo 系统,它主要使用这些
finderlambda 表达式,并且运行良好。我做的另一件事是公开一个允许用户指定finder、orderbys以及skip和take的QuerySpec 类。 -
我对你的 cmets 感兴趣,我的新问题 stackoverflow.com/questions/11979140/…
标签: c# repository-pattern iqueryable objectquery