【发布时间】:2018-03-14 16:44:35
【问题描述】:
我有一个 ASP.NET Core / EF Core 应用程序(网上商店),我需要在其中检索客户的订单并将其显示在网格中(50 个最近的订单)。
包含订单的数据库表包含 ID、总金额等基本信息,但不幸的是,它不包含一个布尔值,告诉我订单是否已支付,我需要知道这一点。
因此,为了确定订单是否已付款,我必须获取已为订单执行的所有付款的总和,并将其与订单的总金额进行比较。
您会推荐我哪种方法以一种高效且性能友好的方式计算此信息,同时考虑适当的软件设计?由于多个旧应用程序正在使用该数据库,因此无法向订单表添加“IsPaid”属性。
到目前为止,我想到了以下可能性:
- 遍历检索到的订单
- 执行一个方法,检查循环中的每个订单并为每个订单返回一个布尔值(已付款/未付款)。
- 可能的缺点:大量的数据库往返(每个订单我们需要 1 个查询)
-
- 将“IsPaid”之类的属性添加到我的模型类中
- 通过 1 次数据库往返获取所有检索到的订单的所有付款并将其存储到内存中
- 遍历订单,确定订单是否已付款并将其设置为 IsPaid 属性
- 可能的缺点:属性“IsPaid”,几乎仅用于此订单概览,对于应用程序的其余部分将为空(或具有无意义的值)
3.
- 创建我的模型的子类,包含属性“IsPaid”的类(例如“OrderSubClass”)
- 如上,通过 1 个数据库往返获取所有检索到的订单的所有付款
- 如上,循环遍历 Orders 并设置子类的这个属性
- 可能的缺点:我不确定为这样的 1 个特定案例创建子类是否被认为是一种好习惯
4.
- 创建一个包含属性“IsPaid”和订单的业务对象
- 如上,通过 1 个数据库往返获取所有检索到的订单的所有付款
- 如上,循环遍历 Orders 并设置子类的这个属性
- 可能的优势:我还可以为此业务对象构建一个接口并使用依赖注入
- 可能的缺点:我不确定使用模型类作为业务对象的属性是否是一种好方法
【问题讨论】: