Интерполяция строк в методах raw SQL, как это возможно?

Я только что проверил новые фьючерсы в Entity Framework Core 2.0. В нем есть очень хорошая функция под названием "интерполяция строк в необработанных методах SQL", который описан здесь.

Он говорит, что этот код:

var city = "Redmond";

using (var context = CreateContext())
{
    context.Customers.FromSql([email protected]"
        SELECT *
        FROM Customers
        WHERE City = {city}");
}

создает этот запрос:

SELECT *
FROM Customers
WHERE City = @p0

это действительно странно для меня! Как!--2--> метод записывается так, как он имеет только и ввод типа string.

как это понять это интерполированная строка, а затем создайте параметр @p0 запрос для этого? Как я могу написать такой метод, как FromSql известно о том, как создаются его строковые параметры?

1 ответов


то, как он просыпается FromSql( принимает FormattableString.

при использовании $"..." что возвращает FormatableString, этот класс позволяет вам проверять переданную строку и видеть все { } блоки внутри и объекты, которые они представляют. Это позволяет фреймворку заменить те { } блоки с параметром местозаполнитель @p0 затем создайте новый параметр, используя что-то похожее на new SqlParameter("@p0", formatableString.GetArgument(0))