Как передать null в заполнитель строкового параметра - PullRequest
1 голос
/ 04 августа 2020

У меня есть динамический c запрос, который мне нужно построить на основе значения, переданного в параметрах URL. Переданное значение может быть нулевым или иметь значение. В этом примере параметром является заголовок. Я использую заполнитель строкового параметра с функцией From Sql C#:

var query = this.BookContext.BookModel.FromSql(
            @"SELECT FROM Books b
            WHERE b.title = {0}, title)

Если в заголовке есть значение, запрос работает нормально, но у меня проблема, когда заголовок равен нулю . Если заголовок равен нулю, условие должно быть b.title IS NULL , поскольку b.title = NULL не будет работать. Мой вопрос в том, как передать условие IS NULL в заполнитель строкового параметра?

Я попытался создать условие динамического c, но это не разрешено в заполнителе строкового параметра, и это имеет смысл, поскольку заполнитель строкового параметра пользы не будет

string bookCondition = title != "null" ? title : "title IS NULL";

var query = this.BookContext.BookModel.FromSql(
            @"SELECT FROM Books b
            WHERE b.title {0}, bookCondition)

Спасибо,

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Не нужно писать динамику c SQL. Я думаю, вам следует использовать функции, предоставляемые EF Core, и попытаться создать запрос linq

var query = context.BookModel;

query = from book in query where book.Title == title select book;
// additional search criteria
if(author.HasValue) 
{
    query = from book in query where book.Author == author.Value select book;
}
// and so on
...
var items = await query.ToListAsync();

для примера выше EF сгенерирует правильный SQL код в зависимости от значения параметра title.

Если вы действительно нужен динамический c SQL вы можете использовать DbParameter в качестве параметра запроса, но в этом случае ваш код становится зависимым от платформы.

Этот код для EF Core 3

var parameter = new SqlParameter("@t", SqlDbType.VarChar);
parameter.Value = title == null ? (object)DBNull.Value : (object)title;
var items1 = context.BookModel
    .FromSqlRaw("select * from Books b where (@t is null and b.title is null) or (b.title = @t)"), parameter);

EF Core версия 2.2 и более ранние имели две перегрузки метода с именем From Sql, которые вели себя так же, как более новые FromSqlRaw и FromSqlInterpolated

0 голосов
/ 05 августа 2020
    var items1 = null;
    if (title == null)
        items1 = context.BookModel.FromSqlRaw("select * from Books b where tile is null");
    else
    {
        var parameter = new SqlParameter("@t", SqlDbType.VarChar);
        parameter.Value = title;
        items1 = context.BookModel.FromSqlRaw("select * from Books b where tile = @t", parameter);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...