我正在努力了解如何最好地查询存储库。
现在让我陷入困境的三个因素是:
- 返回数据类型
- 运行查询的列
- 要返回的记录数
第 1 点
关于问题一:
我的存储库包含许多方法,这些方法返回实体和标量值的组合。这似乎导致了“方法爆炸”。我应该总是返回一个 Entity 对象吗?我应该如何查询只需要一列的对象?
第 2 点 运行查询时,我是否应该包括表中的每一列,即使我只需要一列或两列?如果我为此创建特定查询,它会导致存储库中有更多方法
第 3 点 我应该如何提供查询条件?我阅读了规范,但我的理解是您循环遍历返回的记录并过滤掉传递到新集合中的记录。就性能而言,这似乎不是一个好主意。现在,我只是在 Repo 中创建了一个新方法,例如封装了条件的 getNameById()。
请注意,我没有使用 ORM,我的存储库中只有原始 sql。
更新
第 1 点: 根据答案和更多的研究,这会是一个很好的实现吗?
现在我有一个大型存储库,它返回标量和实体类型对象的混合(所有相同的实体)。我想如果我只使用 GetUser(userId) 方法并忘记编写只返回单个列值的方法,我可以大大减少这个。
例如,如果我需要返回一个用户名,我可以调用 GetUser(userId) 方法来组合用户对象,然后在服务层中将其过滤为用户名。
另一种方法是使用某种我可以传递到存储库中的 QueryBuilder 类,它可以被解析以生成正确的 sql。
第 2 点
回想起来这与第一点非常相似,我目前的解决方案是只获取所有表字段。这是性能和可维护性之间的权衡。
第 3 点
我需要提供某种 where 子句。我不确定这是否有意义通过规范或只是一个 sql 字符串。我目前的解决方案是为这些类型创建新方法,但我想要一些更通用的存储库
总的来说,仍在对此进行研究...我很乐意听到更多关于此的意见或书籍或引用资料的链接,这些书籍或引用资料将它们联系在一起。
最佳答案
I have Repositories with lot of methods that return a combination of both Entities and scalar values. This seems to lead to "method explosion". Should I always return an Entity object? How should I query for objects where I only need one column?
您可以像打击其他 SRP 违规一样打击存储库方法爆炸。您可以为同一实体创建另一个存储库。看这个answer类似的问题。
When running a query should I include every column in the table even if I only need one, or two columns? If I create specific queries for this it leads to more methods in the Repository
这不是 DDD 问题。 领域 驱动设计不处理“行和列”。您加载多少数据来“滋润”域对象总是存在一些冗余,但您必须衡量这是否真的会影响您的性能。如果这真的是性能瓶颈,那么它可能是域模型不正确的症状。
How should I provide conditions for the query? I read about Specifications, but my understanding is that you loop through the returned records and filter out the ones that pass into a new collection. This doesn't seem like a good idea performance wise. Right Now I just make a new method in the Repo like getNameById() which encapsulates the condition.
这又是一个数据访问问题。 DDD 中没有任何内容说您的存储库不能将规范转换为 SQL 查询。这取决于您是执行此操作还是遍历内存中的记录(只要存储库使用者仅看到规范和存储库并且不知道实际实现)。
关于“DDD 中的原始 SQL 与 ORM”,您可能会发现 answer有趣。
关于c# - 存储库和使用原始 sql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9471893/