Я пытаюсь сравнить результаты двух подзапросов в предложении where в SQLKata.
В SQL должно быть так:
WHERE (SELECT count(id) FROM main.someTable) = (SELECT count(id) FROM main.anotherTable)
В SQLKata я могу сравнить результат подзапроса со скалярным значением:
var mainSubquery = new Query("main.someTable")
.SelectRaw("count(id)");
var anotherSubquery = new Query("main.anotherTable")
.SelectRaw("count(id)");
query
.WhereSub(mainSubquery, " = ", 0)
Но я не могу сравнить результаты двух подзапросов таким образом:
query
.WhereSub(mainSubquery, " = ", anotherSubquery),
Как я могу это исправить? Может быть, мне следует выполнить оба подзапроса и только потом сравнивать их результаты?





Никакая перегрузка не принимает запросы как с левой, так и с правой стороны вместе.
Но вы всегда можете скомпилировать запросы и использовать WhereRaw. Один из моментов — быть в курсе приказов о привязках.
Взгляните на этот пример:
using SqlKata;
using SqlKata.Compilers;
var sub1 = new Query("A").SelectRaw("count(1)");
var sub2 = new Query("B").SelectRaw("count(1)");
var compiler = new SqlServerCompiler();
var c1 = compiler.Compile(sub1);
var c2 = compiler.Compile(sub2);
var bindings = c1.Bindings;
bindings.AddRange(c2.Bindings); // order (c1, c2) is important here
var query = new Query("Table").WhereRaw($"({c1.Sql}) = ({c2.Sql})", bindings);
var result = compiler.Compile(query);
Console.WriteLine(result.ToString());
Это выведет следующее
SELECT * FROM [Table] WHERE (SELECT count(1) FROM [A]) = (SELECT count(1) FROM [B])
То же самое, вот как Sqlkata реализована внутри
а что можно сказать о производительности? Что лучше -
WhereSubилиWhereRaw?