最快的客户金额计算方法'命令使用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秒。我怎样才能使它更快呢?任何建议吗?
首先,由于tblCustomerOrders
中有CustomerID
和Amount
列,因此不需要遍历tblCustomers
。你要做的是根据CusotmerID
将tblCustomerOrders
分组,找出总金额并检查金额是否大于输入金额,然后选择符合这些条件的 CustomerID
s。此外,当你在数据库端做所有的东西(我相信你正在使用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();