Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 查询中的业务逻辑重复_Asp.net Mvc_Entity Framework_Web Applications_Domain Driven Design - Fatal编程技术网

Asp.net mvc 查询中的业务逻辑重复

Asp.net mvc 查询中的业务逻辑重复,asp.net-mvc,entity-framework,web-applications,domain-driven-design,Asp.net Mvc,Entity Framework,Web Applications,Domain Driven Design,在我正在进行的项目中,我有一个DebtCollectionCase对象,它包含发票、付款、贷记票据等。。。我遇到的问题是,查询的数量一直在增加,而且还会继续增加,我在这些查询中重复了很多计算。例如,计算以获得取消资助金额或利息。这已经是一团糟,而且会随着时间的推移变得更糟 解决方案是将这些计算放在域对象中,放在函数中,然后可以在每个地方重用,但要做到这一点,我需要在内存中获取整个聚合,这意味着DebtCollectionCase、发票、付款、贷记便笺应该被获取,然后调用函数进行计算。单笔记录应该

在我正在进行的项目中,我有一个
DebtCollectionCase
对象,它包含
发票、付款、贷记票据等。。。我遇到的问题是,查询的数量一直在增加,而且还会继续增加,我在这些查询中重复了很多计算。例如,计算以获得
取消资助金额
利息
。这已经是一团糟,而且会随着时间的推移变得更糟

解决方案是将这些计算放在域对象中,放在函数中,然后可以在每个地方重用,但要做到这一点,我需要在内存中获取整个聚合,这意味着
DebtCollectionCase、发票、付款、贷记便笺
应该被获取,然后调用函数进行计算。单笔记录应该没问题,但当我需要这些记录的列表时,会发生什么呢?一大堆催收欠款的案例,包括它们的发票和付款。这将需要获取大量数据,并可能影响性能


因此,这是一个在内存中进行计算的问题,这有利于重用性和维护,并将业务逻辑放入查询中,这意味着性能更好,但维护和维护更困难。有没有人建议我应该使用哪种方法

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

很可能您的域设计不好。更具体地说,似乎
DebtCollectionCase
“聚合”确实太大了,不能真正反映您的业务不变量。所以,我会从重新思考你的模型开始。如果您仍然认为它是可以的(或者您不能更改它),我会选择特殊的“投影”只读模型,它由数据库高效查询支持(存储库模式可能适合您)。如果我理解您的问题,请告诉我。还有第三种选择,即将结果计算缓存在属性中,并将其存储在数据库中。它的复杂部分现在变成了确保在状态的某些部分发生变化时重新计算属性,而这些变化本身可能很复杂(反应式编程技术可能会有帮助),但它允许在保持查询简单高效的同时保持域中的业务逻辑。我找到了一个解决方案,它被称为DelegateDecompiler。它允许您在linq Select和Where语句中使用实体未映射的属性和函数,这意味着它们是可重用的,并且被转换为SQL,因此我不需要在内存中获取实体。如果有人需要,这里有链接。@Aleksa这很酷。你应该把它作为答案贴出来。