首页 > 解决方案 > 优化实体框架(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() ,这是尝试通过在线搜索对其进行优化。

标签: c#.netwinformsentity-frameworkentity-framework-6

解决方案


推荐阅读