В фоновом режиме используются 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 запросов.


Вы можете использовать условную агрегацию только с одним запросом:
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.
Выглядит очень многообещающе, буду пробовать.