假设我需要获取 parentid 等于 1 的所有项目。
首先,停止以这种方式考虑您的数据访问需求。
您不需要“获取 parentid 等于 1 的所有项目”。这将有助于尝试并停止以这种面向数据的方式进行思考。
您需要的是获取具有特定父级的所有项目。这是一个存在于您的问题空间(您的应用程序域)中的概念。
您在数据库中使用外键和名为 parentid 的字段对其建模这一事实是一个实现细节。封装它,不要在整个应用程序中泄漏它。
一种方法是使用 IQueryable List() 并获取所有文档,然后添加 where 子句来选择 parentid 等于 1 的项目。这似乎是个坏主意,因为我不能在 RavenDB 中使用任何索引功能。所以另一种方法是在存储库中有这样的东西, IEnumerable Find(string index, Func predicate) 但这似乎也是一个坏主意,因为
这两个都是坏主意。您的建议是要求调用您的存储库或查询的代码了解您的架构。
为什么你的存储库的消费者应该关心或知道有一个 parentid 字段?如果这种情况发生了变化,如果您的问题空间中某些特定概念的定义发生了变化,那么您的代码中有多少地方必须更改?
每个获取具有特定父项的项目的地方。
这很糟糕,它是封装的对立面。
我的观点是,您将希望将查询建模为显式概念,而不是 lambda 或字符串到处传递和使用。
您可以使用规范模式、存储库上的命名查询方法、查询对象模式等显式建模查询。
它不够通用,如果我要从 RavenDB 更改为通用 sql 服务器,则需要我实现此方法。
嗯,Func
太笼统了。同样,考虑一下您的消费代码需要知道什么才能使用这种查询方法,您将代码的上层直接绑定到您的 DB 模式执行此操作。
此外,如果您从一个存储引擎更改为另一个,则无法避免重新实现查询,因为性能足以使用特定于存储引擎的辅助工具(例如 Raven 中的索引)。