Получить необработанную строку SQL в Sql Kata - PullRequest
1 голос
/ 13 июня 2019

Я использую SqlKata исключительно для создания запросов SQL в C #. Я хочу взять выходные данные моей сборки Query, получить необработанную (скомпилированную) строку sql и выполнить ее для SQL.

Я думал, что это сделает:

var factory = new QueryFactory(null, new SqlServerCompiler());
var query = new Query();
...
var sqlText = factory.Compiler.Compile(query).Sql;

Но это дает:

SELECT TOP (@p0) [AllStarFull].[GameNumber], [AllStarFull].[LeagueId], [AllStarFull].[PlayedInGame] FROM [AllStarFull]

Это вызывает исключение, потому что (@p0) является параметром, а не фактическим значением.

В документации упоминается, что нужно ввести Logger, но мне действительно не нужна функциональность регистрации (прямо сейчас).

https://sqlkata.com/docs/execution/logging

var db = new QueryFactory(connection, new SqlServerCompiler());

// Log the compiled query to the console
db.Logger = compiled => {
    Console.WriteLine(compiled.ToString());
};

var users = db.Query("Users").Get();

В любом случае можно получить необработанную строку sql из Query со всеми заполненными параметрами?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Если вам нужно просто построить SQL, нет необходимости включать пакет SqlKata.Execution (который включает класс QueryFactory).

Самый простой способ:

using SqlKata;
using SqlKata.Compilers;

// Create an instance of SQLServer
var compiler = new SqlServerCompiler();

var query = new Query("Users").Where("Id", 1).Where("Status", "Active");

SqlResult result = compiler.Compile(query);

string sql = result.Sql;
List<object> bindings = result.Bindings; // [ 1, "Active" ]

Как уже упоминалось в документации, вы можете использовать result.ToString() для получения полного запроса

var sql = result.ToString();

, но это не очень хорошая практика, правильный способ - использовать параметризованный запрос с привязками для его выполнения.

взято из https://sqlkata.com/docs#compile-only-example

0 голосов
/ 13 июня 2019

Это не задокументировано (насколько я могу судить), но, понюхав объект немного больше, я понял это.Я могу просто сделать следующее:

factory.Compiler.Compile(query).ToString();

...