EF6,asp mvc内核和SQL Server在后台使用。
我必须对具有不同条件的同一张表进行多次查询,例如
SELECT COUNT(*) FROM Table1 WHERE a = true
SELECT COUNT(*) FROM Table1 WHERE b = true
SELECT COUNT(*) FROM Table1 WHERE a = true || b = true
SELECT a FROM Table1 WHERE b = true
因此有4个查询以不同的条件对Table1
进行了查询。我认为结果是我必须阅读整个Table1
四次。在伪代码中,它可能看起来像这样。
var res1 = new list();
foreach(var rec in Table1) { // read Table1 first time
if(rec.a == true) {
res1.push(rec);
}
}
var res2 = new list();
foreach(var rec in Table1) { // read Table1 second time
if(rec.b == true) {
res2.push(rec);
}
}
var res3 = new list();
foreach(var rec in Table1) { // read Table1 third time
if(rec.a == true || rec.b == true) {
res3.push(rec);
}
}
var res4 = new list();
foreach(var rec in Table1) { // read Table1 fourth time
if(rec.b == true) {
res4.push(rec);
}
}
我想知道如何只读一次Table1
并得到四种不同的结果,就像这样:
var res1 = new List();
var res2 = new List();
var res3 = new List();
var res4 = new list();
foreach(rec in Table1) { // read Table1 first time
if(a == true) {
res1.push(rec);
}
if(b == true) {
res2.push(rec);
}
if(a == true || b == true) {
res3.push(rec);
}
if(b == true) {
res4.push(rec);
}
}
还有一个挑战,那就是那些查询是动态sql,我的意思是a = true
,b = true
,a = true || b = true
存储在数据库中。查询以这种方式运行:
string query = "SELECT Count(*) FROM Table1 WHERE" + condition;
var count = ExecuteSql(query);
上面的示例已简化,但实际上所有查询都被拆分并存储在数据库中。
PS。实际上,我想加快页面速度,它向服务器发出30-40个请求,每个请求都是对同一张表的查询。我想如果我可以用一个请求而不是40个请求代替它们。
答案 0 :(得分:3)
您可以仅通过单个查询使用条件聚合:
SELECT
COUNT(CASE WHEN a = true THEN 1 END) AS cnt_a,
COUNT(CASE WHEN b = true THEN 1 END) AS cnt_b,
COUNT(CASE WHEN a = true OR b = true THEN 1 END) AS cnt_a_b
FROM Table1;
这会将全表扫描的次数从3减少到1。而且,还将有可能将往返数据库的往返次数从3减少到1。