0

在我正在处理的项目中,我有DebtCollectionCase对象,其中包含Invoices, Payments, CreditNotes等...我遇到的问题是查询数量一直在增加,并且它会继续增加在这些查询中我有很多重复的计算。例如,计算得到UnpaidAmountInterest。这已经是一团糟了,随着时间的推移它会变得更糟。在查询中复制业务逻辑

解决方法是将这些计算放在域对象中,然后在函数中使用,然后在每个地方都可以重复使用,但要做到这一点,我需要在内存中获取整个聚合,这意味着应该提取DebtCollectionCase, Invoices, Payments, CreditNotes然后调用函数来进行计算。对于单个记录应该是可以的,但是当我需要这些记录的列表时,可以使用其发票和付款对DebtCollection案例进行追查。这将是一个大量的数据获取,它可能会影响性能。

所以这是一个在内存计算中做的问题,它对于可重用性和维护性更好,并将bussines逻辑放在查询中,这意味着更好的性能但更难维护和违反DRY。有没有人有任何建议我应该使用的方法?

+0

很可能你的域名设计不好。更具体地说,它似乎'DebtCollectionCase'“聚合”是绝对太大,并不真正反映您的业务不变量。所以,我会从重新思考你的模型开始。如果你仍然认为它是可以的(或者你不能改变它),我会选择特殊的“投影”只读模型,这是由数据库高效查询(存储库模式可能适合你)支持的。请让我知道,如果我明白你的问题。 –

+0

还有第三个选项,它将结果中的计算结果缓存在属性中并将它们存储在数据库中。它的复杂部分现在变成确保当状态的某些部分发生变化时可以重新计算属性(反应式编程技术可能会有所帮助),但它允许在保留查询的同时保持业务逻辑在域中简单而高效。 – plalx

+0

我找到了一个解决方案,它被称为DelegateDecompiler。它可以让你在linq Select和Where语句中使用实体未映射的属性和函数,这意味着它们是可重用的,并且被转换为SQL,因此我不需要在内存中获取实体。这是链接,如果有人需要https://github.com/hazzik/DelegateDecompiler。 – Aleksa

回答

1

我找到了一个解决方案,它叫DelegateDecompiler。它可以让你在linq Select和Where语句中使用实体未映射的属性和函数,这意味着它们是可重用的,并且被转换为SQL,因此我不需要在内存中获取实体。这是链接,如果有人需要Link to DelegateDecompiler