最快的客户金额计算方法'命令使用Linq

本文关键字:命令 Linq 方法 客户 金额 计算 | 更新日期: 2023-09-27 18:13:45

在我的数据库中,我有许多客户,我提交每个客户的订单。现在我需要循环遍历所有客户并找到订购价格超过目标价格的客户。我使用这段代码:

List<int> IDz = new List<int>();
foreach (var customer in db.tblCustomers)
{
    total = 0;
    foreach (var order in db.tblCustomerOrders.Where(x => x.CustomerID == customer.CustomerID))
        total += Convert.ToDouble(order.Amount);
     if (total >= Convert.ToDouble(txtAmount.Text))
         IDz.Add(customer.CustomerID);
}

此代码将花费大约1500个客户超过15秒。我怎样才能使它更快呢?任何建议吗?

最快的客户金额计算方法'命令使用Linq

首先,由于tblCustomerOrders中有CustomerIDAmount列,因此不需要遍历tblCustomers。你要做的是根据CusotmerIDtblCustomerOrders分组,找出总金额并检查金额是否大于输入金额,然后选择符合这些条件的 CustomerIDs。此外,当你在数据库端做所有的东西(我相信你正在使用EntityFramework),你的查询必须更快。

double inputAmount = Convert.ToDouble(txtAmount.Text);
var result = db.tblCustomerOrders
    .GroupBy(m => m.CustomerID)
    .Select(g => new
    {
        CustomerID = g.Key,
        Sum = g.Sum(m => m.Amount)
    })
    .Where(m => m.Sum > inputAmount)
    .Select(m => m.CustomerID)
    .ToList();

您可以尝试以下方法来计算总金额:

double total = db.tblCustomerOrders.Where(x => x.CustomerID == customer.CustomerID).Select(t => t.Amount ?? 0).Sum();

如果t.Amount为null,使用null合并运算符将给你一个默认的0。

希望对你有帮助,谢谢

试试这个,它将缩短查询时间,通过在查询中进行计算而不首先获得客户

 double amnt = Convert.ToDouble(txtAmount.Text);
 List<int> IDz = db.tblCustomers.Where(c => db.tblCustomerOrders.Where(o => o.CustomerID == c.CustomerID).Sum(o => o.Amount) > amnt).Select(c => c.CustomerID).ToList();