在我的数据库中,我有很多客户,我提交每个客户的订单。 现在,我需要遍历所有客户,找到订单超过目标价格的客户。我正在使用这段代码:
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秒。我怎样才能更快?有什么建议吗?
答案 0 :(得分:4)
首先,由于CustomerID
中有Amount
和tblCustomerOrders
列,因此无需循环遍历tblCustomers
。您需要做的是根据tblCustomerOrders
对CusotmerID
进行分组,查找总金额并检查金额是否大于输入金额,然后选择符合这些标准的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();