有没有办法让这个查询更快,并在循环外构建where子句?

时间:2018-01-28 10:35:27

标签: c# sql sql-server

我有以下代码,(我完全了解参数化查询和SQL注入):

foreach(var item in items)
{
    string query = "select sum(convert(decimal(18,3),tbl.Price)) p, sum(convert(decimal(18,2),tbl.Sale)) s from table1 tbl " +
               $"where tbl.ID = {item .ID}";
    Execute(query);
    //Do stuff with query result
}

问题是我有很多项目,我必须为每个项目执行查询,因为where子句将在每个步骤中完成。我想如果我能够在循环中查询我的查询,我的查询会更快。但我不知道怎么做。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:7)

而不是为每个项目执行查询。您可以将group by添加到查询中并仅执行一次。

string query = "select tbl.ID, sum(convert(decimal(18,3),tbl.Price)) p, sum(convert(decimal(18,2),tbl.Sale)) s from table1 tbl group by tbl.ID ";
var result = Execute(query);

foreach(var item in items)
{
    var row = result.Select(r => r.ID == item.ID).FirstOrDefault();
    //Do stuff with query result
}

答案 1 :(得分:2)

不要单独为每个ID执行查询。相反,使用group by为所有ID执行单个查询,以获取每个p的{​​{1}}和s值以及参数化id子句(或者更好的是,存储具有表值参数的过程。)

以下是查询的in版本:

IN

select Id, sum(convert(decimal(18,3),tbl.Price)) p, sum(convert(decimal(18,2),tbl.Sale)) s from table1 tbl Where Id IN(<1,2,3,4....>) group by Id 替换为描述为in this answer.

的参数

以下是查询的表值参数版本:

<1,2,3,4....>

有关使用表值参数的详细说明,请阅读this answer.