c# - 优化实体框架(gridview 中每个模型的多个查询)
问题描述
我正在开发 WinForms 中的应用程序。我的数据存储在 MSSQL 服务器 (Azure) 中。我的应用程序的一部分包括一些基本的计费功能。我拥有的一种模型是 Invoices,但我遇到了相当大的性能问题。我的第一个问题真的是,谁是罪魁祸首?我优化不佳的代码或底层实体框架。主要问题在于当我在 DataGridView 中显示发票列表时。对于我列出的每张发票,我需要多次调用 DBContext。这不合理吗?出于这个原因,我需要打多个电话;一个获取要显示的发票列表(基于 FK CustomerID),然后对于每个发票模型,我调用一些方法来计算诸如 SubTotal、TaxTotal 等内容。这些函数如下所示。
public decimal SubTotal()
{
decimal subtotal = 0;
List<Billing_InvoiceItems> LineItems = db.Billing_InvoiceItems.Where(a => a.InvoiceID == this.id).AsNoTracking().ToList();
{
foreach (var LineItem in LineItems)
subtotal += (LineItem.Cost * LineItem.Quantity);
}
return subtotal;
}
public decimal TaxTotal()
{
decimal taxtotal = 0;
List<Billing_InvoiceItems> LineItems = db.Billing_InvoiceItems.Where(a => a.InvoiceID == this.id).AsNoTracking().ToList();
foreach (var LineItem in LineItems)
{
if (LineItem.Taxable)
{
taxtotal += LineItem.Cost * (decimal) LineItem.TaxPercentage;
}
}
return taxtotal;
}
public decimal Total()
{
return (this.SubTotal() + this.TaxTotal());
}
public decimal TotalDue()
{
return (this.Total() - this.TotalPaid());
}
public decimal TotalPaid()
{
List<Billing_PaymentToInvoice> paymentsToInvoice = db.Billing_PaymentToInvoice.Where(a => a.InvoiceID == this.id).ToList();
decimal totalpaid = 0;
foreach (var Payment in paymentsToInvoice)
{
totalpaid += (decimal)Payment.AmountApplied;
}
return totalpaid;
}
我需要为我列出的每张发票进行多个 SQL“查询”,这是不合理的吗?或者有没有办法优化这些功能?我尝试了一种方法来缓存发票项目(允许我计算总数以显示给用户)但是,这需要我有一个我似乎经常调用的函数来保持缓存最新。
编辑:您将在 LineItems 查询中看到 .AsNoTracking() ,这是尝试通过在线搜索对其进行优化。
解决方案
推荐阅读
- r - 为什么智能舍入与 map/lapply 的工作方式不同?
- azure - ACR 推送错误 - 收到意外的 HTTP 状态:502 服务器挂断
- actionscript-3 - 您如何在此代码中的文本之间暂停?
- azure - 如何在 Kusto 查询语言中使用带有 '!contains' 的 where 子句中存储在 'let' 中的 skalar
- r - igraph ggraph r中的颜色节点
- c++ - 使用 std::Vector 设置二维数组
- arrays - 从弹性搜索查询中返回数组的第一个 n 元素
- c++ - ASM 对 C++ 的调用
- sas - 如何格式化日期以在 SAS 中使用?
- machine-learning - 机器学习模型不同的输入