我有以下代码,(我完全了解参数化查询和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子句将在每个步骤中完成。我想如果我能够在循环中查询我的查询,我的查询会更快。但我不知道怎么做。有没有办法做到这一点?
答案 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.