Необработанный SQL-запрос в Entity Framework Core не работает должным образом при использовании string.Формат

#sql-server #entity-framework-core #string.format

#sql-сервер #entity-framework-core #string.format

Вопрос:

Этот запрос работает правильно:

 var results = _mp4Db.Videos.FromSql(
            "Select * 
             from Video 
             where isValid = 1 
               and (contains(Subject,'""   text   ""   '*'   ""') 
                    or contains(Description,'""   text   ""   '*'   ""')) 
             order by 
                 case 
                    when contains(Subject,'""   text   ""   '*'   ""') 
                       then 1 
                       else 2 
                 end, 
                 len(Subject) 
             offset 20 rows fetch next 20 rows only ");
  

Но если я использую string.Format для более четкого кода, он не возвращает результат, который должен:

  var results = _mp4Db.Videos.FromSql(
            "Select * 
             from Video 
             where isValid=1 
                 and (contains(Subject,'"{0}{1}"') 
                 or contains(Description,'"{0}{1}"')) 
             order by case 
                 when contains(Subject,'"{0}{1}"') 
                     then 1 
                     else 2 End , 
                 LEN(Subject) 
             Offset 20 rows fetch next 20 rows only ", text, '*');
  

Есть идеи, чего здесь не хватает?

Комментарии:

1.Я не вижу ничего string.Format в вашем втором примере — простого добавления таких заполнителей {0} недостаточно — вы должны использовать string.Format() явно

2. Да, не заметил, что он был преобразован с помощью автоматической коррекции Resharper, спасибо!

Ответ №1:

Попробуйте использовать $ operator и выполнить запрос, вызвав .ToList() метод:

 var results = _mp4Db.Videos.FromSql(
    $"Select * from Video where isValid=1 and (contains(Subject,'"{text}{'*'}"') "  
        $"or contains(Description,'"{text}{'*'}"')) "  
        $"order by case when contains(Subject,'"{text}{'*'}"') then 1 "  
        $"else 2 End , LEN(Subject) Offset 20 rows fetch next 20 rows only "
).ToList();