如何查询和存储必须为循环中的多个条目计算的数据

时间:2018-03-13 16:42:07

标签: asp.net-core .net-core

我有一个ASP.NET Core / EF Core应用程序(网上商店),我需要检索客户的订单并将其显示在网格中(最近50个订单)。

带有订单的数据库表包含基本信息,如ID,总金额等,但不幸的是,它不包含一个布尔值,告知订单是否已付款,我需要知道。

因此,为了确定订单是否已经支付,我被迫获得已为订单执行的所有付款的总和,并将其与订单的总金额进行比较。

您建议我采用哪种方法以高效且性能友好的方式计算此信息,同时考虑适当的软件设计?由于使用数据库的几个遗留应用程序,因此无法向orders表添加“IsPaid”属性。

到目前为止,我想到了以下可能性:

    • 循环检索订单
    • 执行一个方法,检查循环中的每个订单,并为每个订单返回一个布尔值(已付款/未付款)。
    • 可能的缺点:大量的数据库往返(我们每个订单需要1次查询)
    • 将“IsPaid”等属性添加到我的模型类
    • 使用单个数据库往返获取所有检索到的订单的所有付款并将其存储到内存中
    • 循环订单,确定订单是否已付款并将此设置为IsPaid-property
    • 可能的缺点:几乎仅用于此订单概述的属性“IsPaid”对于应用程序的其余部分将为null(或具有无意义的值)。

    3

    • 创建我的模型的子类,包含属性“IsPaid”的类(例如“OrderSubClass”)
    • 如上所述,使用1个数据库 - 往返行程
    • 获取所有已检索订单的所有付款
    • 如上所述,遍历Orders并设置子类的此属性
    • 可能的缺点:我不确定是否为这样的特定案例创建子类被认为是一种好习惯

    4

    • 创建一个包含属性“IsPaid”和订单
    • 的Business对象
    • 如上所述,使用1个数据库 - 往返行程
    • 获取所有已检索订单的所有付款
    • 如上所述,遍历Orders并设置子类的此属性
    • 可能的优势:我还可以为此业务对象构建一个接口并使用依赖注入
    • 可能的缺点:我不确定使用Model-Class作为业务对象的属性是一种好方法

1 个答案:

答案 0 :(得分:0)

您可以创建新表(即付款)并设置引用订单的外键。该表可用于存储bool IsPaid以及您可能需要保留的任何其他信息,可能会使您的工作的其他部分更容易。不确定这是否可行,取决于您需要支持的遗留应用程序。