插值字符串上的 Ef Core vs Linq

Posted

技术标签:

【中文标题】插值字符串上的 Ef Core vs Linq【英文标题】:Ef Core vs Linq on interpolated string 【发布时间】:2019-11-01 00:46:48 【问题描述】:

使用插值字符串发送 sql server 查询,为什么使用 LINQ to SQL 上的数据上下文需要添加单引号?

db.ExecuteCommand($"delete table where date = 'date:yyyy-MM-dd'");

在使用 EF Core 时,您需要删除它们吗?

db.Database.ExecuteSqlCommand($"delete table where date = date:yyyy-MM-dd"); 

以及为什么在 EF Core 中,如果您使用 String.Format 而不是插值,则需要放回单引号:

String.Format("delete table where date='0'", date.ToString("yyyy-MM-dd"));

【问题讨论】:

【参考方案1】:

主要区别在于:$"hello variable" 不是字符串。这是FormattableString。 Entity Framework 将利用这一点并使用它来解析参数。

String.Format 另一方面将创建一个新的格式化字符串,没有元信息(或应该)格式化什么。实体框架没有将其解析为数据库参数的好方法。它必须将它按原样发送到数据库。

总结一下:如果你传递一个字符串,它必须有正确的格式,这样数据库才能理解文本。如果您向实体框架传递它可以理解并且可以从中解析出元数据的东西,它会将其转换为数据库参数,并且您不需要适当的格式,因为它不会以纯文本形式发送,而是以带有数据库参数的文本形式发送。

为什么 Linq-to-Sql 不使用FormattableString 的力量?可能是因为它甚至在此功能存在之前就已被弃用。

【讨论】:

好的,谢谢。阅读此内容以获得更详细的解释很有帮助:cmatskas.com/ef-core-string-interpolation-and-sql-injection

以上是关于插值字符串上的 Ef Core vs Linq的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 多对多关系上的 LINQ 查询

使用 Entity Framework Core 在 LINQ 查询中将字符串转换为 DateTime

如何比较 EF Core 插值查询中的整数列表

EF6 Dynamic Linq 将字符串转换为十进制

LINQ EF Core 左连接 [重复]

无法从 Linq 查询 EF Core 访问字段值