使用Linq计算客户订单总和的最快方法

时间:2016-10-19 05:59:48

标签: c# linq

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

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秒。我怎样才能更快?有什么建议吗?

3 个答案:

答案 0 :(得分:4)

首先,由于CustomerID中有AmounttblCustomerOrders列,因此无需循环遍历tblCustomers。您需要做的是根据tblCustomerOrdersCusotmerID进行分组,查找总金额并检查金额是否大于输入金额,然后选择符合这些标准的CustomerID。此外,当您在数据库端执行所有这些操作时(我相信您正在使用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();

答案 1 :(得分:2)

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

t.Amount

如果n=50 p=0.32 P=matrix( c(p, 1-p, 0, 0, 0, 0, p, 0, 1-p, 0, 0, 0, p, 0, 0, 1-p, 0, 0, 0, p, 0, 0, 1-p, 0, 0, 0, p, 0, 0, 1-p, 0, 0, 0, p, 0, 1-p), ncol=6, nrow=6, byrow = T) X=2 for(j in 1:n) {Y=runif(1) k=P[X[j],] k=cumsum(k) if(Y<=k[1]) {X[j+1]=1} else if (Y<=k[2]) {X[j+1]=2} else if (Y<=k[3]) {X[j+1]=3} else if (Y<=k[4]) {X[j+1]=4} else if (Y<=k[5]) {X[j+1]=5} else {X[j+1]=6}} mean(X) x=c(1,2,3,4,5,6) y=c(0.1,0.15,0.22,0.29,0.38,0.45) approx(x,y,xout=mean(X)) 为空,则使用空合并运算符将为您提供默认值。

希望它会对你有所帮助,谢谢

答案 2 :(得分:2)

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

 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();