内插字符串上的Ef Core vs Linq

sof*_*ntp 5 c# sql-server linq-to-sql ef-core-2.2

使用插值字符串发送sql服务器查询,为什么要在LINQ to SQL上使用datacontext,则需要添加单引号?

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

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

db.Database.ExecuteSqlCommand($"delete table where date = {date:yyyy-MM-dd}"); 
Run Code Online (Sandbox Code Playgroud)

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

String.Format("delete table where date='{0}'", date.ToString("yyyy-MM-dd"));
Run Code Online (Sandbox Code Playgroud)

nvo*_*igt 3

主要区别在于 this:$"hello {variable}"不是字符串。这是一个FormattableString。实体框架将利用这一点并使用它来解析其中的参数。

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

总结一下:如果传递一个字符串,它必须具有正确的格式,以便数据库能够理解该文本。如果您传递实体框架它理解并可以解析元数据的内容,它会将其转换为数据库参数,并且您不需要正确的格式,因为它不会以纯文本形式发送,而是以带有数据库参数的文本形式发送。

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