C# · 12月 22, 2021

c# – 存储库和使用原始sql查询?

我正在努力了解如何最好地查询存储库.

现在让我通过循环的三个因素是:

>返回数据类型
>要运行查询的列
>要返回的记录数

第1点

关于问题一:

我有许多方法的存储库返回实体和标量值的组合.这似乎导致“方法爆炸”.我应该总是返回一个Entity对象吗?我该如何查询只需要一列的对象?

第2点
在运行查询时,我是否应该包括表中的每一列,即使我只需要一列或两列?如果我为此创建特定查询,则会导致存储库中有更多方法

第3点
我该如何为查询提供条件?我读到了有关规范的内容,但我的理解是您循环返回的记录并过滤掉传入新集合的记录.这似乎不是一个明智的表现.现在我只是在Repo中创建一个新方法,如getNameById(),它封装了条件.

请注意,我没有使用ORM,我只是在我的存储库中有原始sql.

更新

第1点:
根据答案和更多的研究,这将是一个很好的实施?

现在我有一个大型存储库,它返回标量和实体类型对象的混合(所有相同的实体).我想如果我只使用GetUser(userId)方法并忘记编写只返回单列值的方法,我可以大大减少这个.

例如,如果我需要返回一个用户名,我可以调用GetUser(userId)方法来润滑User对象,然后在服务层中将其过滤到用户名.

另一种方法是使用某种我可以传递到Repository的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中没有任何内容表明您的存储库无法将Specification转换为SQL查询.无论您是这样做还是迭代内存中的记录(只要存储库使用者只看到规范和存储库并且不知道实际的实现),由您决定.

关于’原始sql与DDD中的ORM’,您可能会发现answer很有趣.