c# - 原始 SQL 方法中的字符串插值,这怎么可能?

标签 c#

我刚刚检查了 Entity Framework Core 2.0 中的新 futures。其中有一个非常好的功能,称为“原始 SQL 方法中的字符串插值”,描述为 here .

它说这段代码:

var city = "Redmond";

using (var context = CreateContext())
{
    context.Customers.FromSql($@"
        SELECT *
        FROM Customers
        WHERE City = {city}");
}

创建此查询:

SELECT *
FROM Customers
WHERE City = @p0

我真的很奇怪! FromSql 方法是如何编写的,因为它只有字符串类型的输入。

它如何理解它是一个插值字符串,然后为它创建一个参数@p0查询?我如何编写一个像 FromSql 这样的方法,知道它的字符串参数是如何创建的?

最佳答案

它的工作方式是 FromSql( accepts a FormattableString .

当您使用返回 FormatableString$"..." 时,该类允许您检查传入的字符串并查看其中的所有 { } block 及其代表的对象。这允许框架用占位符参数 @p0 替换那些 { } block ,然后使用类似于 new SqlParameter("@p0", formatableString.GetArgument(0))

关于c# - 原始 SQL 方法中的字符串插值,这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45698722/

相关文章:

c# - 同一页上有多个图像的 Crystal 报表

c# - 将项目添加到未知类型的 ObservableCollection

c# - 以字节流形式下载 PDF,然后在 Xamarin.Forms 的默认 Android 应用程序中打开

c# - 如何在 C# 中连接到 .sdf 本地数据库文件

c# - 在 ServiceProvider 中使用时,如何防止 DbContext 用完可用的池连接?

c# - 当我在 asp.net mvc Controller 操作中验证失败时,如何保留我的 url

c# - 在项目中添加一个EXE文件,这样它就会像DLL一样被复制到Bin/Debug文件夹中?

C#.NET IntPtr 无效类型

c# - 如何在 .NET 中正确转义文档名称?

c# - 如何使用最小起订量模拟私有(private)只读 IList<T> 属性