【问题标题】:String interpolation in raw SQL methods, How is it possible?原始 SQL 方法中的字符串插值,这怎么可能?
【发布时间】:2017-08-15 17:59:45
【问题描述】:

我刚刚检查了 Entity Framework Core 2.0 中的新未来。其中有一个非常好的特性,称为 “原始 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 这样的方法来了解其字符串参数是如何创建的?

【问题讨论】:

  • 我正在关注 C# 功能 6 和 7,但我以前从未听说过这样的功能!?怎么写FromSQL这样的方法?
  • @mehrandvd 虽然我不声称知道他们是如何做到的,但正在发生的事情是,在他们提取字符串中找到的占位符的方法中,用它们创建参数并替换带有参数名称的字符串。
  • @Vanna 我的问题是关于FromSql。你的意思是它用参数替换所有值?例如,如果我有AND IsActive = 1,它会创建另一个@p2,尽管没有被插值?
  • 大概,FromSql 接受 FormattableString,而不是 string
  • 另一个关于字符串插值的类似问题stackoverflow.com/questions/29068194/…

标签: c#


【解决方案1】:

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

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

【讨论】:

  • 貌似FromSql也有直接接受FormattableStrring的an overload
  • 刚刚看到,正在更新
  • 这与通过 {} 转义的 Oracle Text 冲突。如何在 EF 中禁用此功能?
  • 使用双 {{}} 转义 { }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多