内插字符串上的Ef Core vs Linq

时间:2019-06-18 11:22:47

标签: c# sql-server linq-to-sql ef-core-2.2

使用插值字符串发送sql服务器查询,为什么要在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 个答案:

答案 0 :(得分:3)

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

另一方面,

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

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

Linq-to-Sql为什么不使用FormattableString的功能?可能是因为此功能在存在之前就已过时。