【发布时间】:2018-05-03 07:58:33
【问题描述】:
我正在使用带有 ASP.NET Core 的实体框架核心,代码优先。
在我的应用程序中,我有发票,具有典型的 InvoiceHeader -> InvoiceLine 关系。 InvoiceLine 实体有一个 LineAmount 字段,当显示为列表时,我想对其求和并显示在 InvoiceHeader 上(这样我可以在查看发票列表时看到发票总额)。
我猜我需要将TotalAmount 属性添加到InvoiceHeader 实体,并带有注释[NotMapped]。但是如何最有效地填充它呢?
目前我的InvoiceHeaderController.Index() 是:
// GET: InvoiceHeaders
public async Task<IActionResult> Index()
{
ApplicationUser appUser = ConstantData.GetApplicationUser(_context, _userManager.GetUserId(User));
var applicationDbContext = _context.InvoiceHeader.Include(i => i.Customer).Include(i => i.CustomerBranch)
.Where(i => i.CustomerID == appUser.CustomerID);
return View(await applicationDbContext.ToListAsync());
}
谁能告诉我计算(求和)这个TotalAmount 属性的最有效方法是什么?
谢谢。
【问题讨论】:
-
您的数据模型不应包含该属性。使用视图模型。您可以使用 linq
.Sum()来获取总数。 -
InvoiceLine 中有 Line Amount 字段,并且 InvoiceHeader 中已有一个 CustomerID 字段。您必须在 Invoiceheader 控制器中根据客户填充 Line 金额的总和吗?
-
@StephenMuecke:实际上,这取决于。有时预先计算总量并将其存储在“标题”中很有用 - 当您不需要详细信息时,检索速度会更快。有时这可用于验证数据完整性(某种审计)。当然,这也有它的缺点。
-
@Saneeshkunjunni:CustomerID 在这里并不重要。这只是这张发票所针对的客户的 ID。一个客户可以有多张发票,在这种情况下,一个客户的每张发票会有不同的总数
-
@StephenMuecke:谢谢。我会试试的。
标签: c# asp.net asp.net-mvc entity-framework entity-framework-core