【发布时间】:2012-03-01 02:40:45
【问题描述】:
我正在努力了解如何最好地查询存储库。
现在让我陷入困境的三个因素是:
- 返回数据类型
- 要运行查询的列
- 要返回的记录数
第 1 点
关于问题一:
我的存储库包含许多返回实体和标量值组合的方法。这似乎导致了“方法爆炸”。我应该总是返回一个实体对象吗?我应该如何查询只需要一列的对象?
第 2 点 运行查询时,即使我只需要一列或两列,我是否应该包含表中的每一列?如果我为此创建特定查询,则会导致存储库中的更多方法
第 3 点 我应该如何为查询提供条件?我阅读了规范,但我的理解是您遍历返回的记录并过滤掉传递到新集合中的记录。这在性能方面似乎不是一个好主意。现在我只是在 Repo 中创建了一个新方法,例如封装条件的 getNameById()。
请注意我没有使用 ORM,我的存储库中只有原始 sql。
更新
第 1 点: 根据答案和更多研究,这将是一个好的实施吗?
现在我有一个大型存储库,它返回标量和实体类型对象的混合(所有相同的实体)。我想如果我只使用 GetUser(userId) 方法而忘记编写只返回单列值的方法,我可以大大减少这种情况。
例如,如果我需要返回一个用户名,我可以调用 GetUser(userId) 方法来混合 User 对象,然后在服务层将其过滤到用户名。
另一种方法是使用某种 QueryBuilder 类,我可以将其传递到存储库中,可以对其进行解析以生成正确的 sql。
第 2 点
回想起来,这与第一点非常相似,我目前的解决方案是获取所有表字段。这是性能和可维护性之间的权衡。
第 3 点
我需要提供某种 where 子句。我不确定这是否有意义通过规范或只是一个 sql 字符串。我目前的解决方案是为这些类型创建新方法,但我希望存储库更通用
总体而言,仍在对此进行研究...我很想听听对此的更多意见,或者将这些联系在一起的书籍或参考资料的链接。
【问题讨论】:
-
你在课堂上动态创建Sql命令吗?
-
原始 SQL 并且没有 ORM,哈?就像生活在边缘一样,是吗?说真的,为什么要处理原始 sql?
-
@kerezo - 我有 sql 参数并使用 addwith value
标签: c# domain-driven-design repository repository-pattern ddd-repositories