内插字符串上的 Ef Core 与 Linq
Ef Core vs Linq on interpolated string
使用内插字符串发送 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"));
主要区别在于:$"hello {variable}"
是 而不是 字符串。这是一个FormattableString。 Entity Framework 将利用它并使用它来解析其中的参数。
另一方面,String.Format
将创建一个新的格式化字符串,而没有 meta-information 已经(或应该)格式化的内容。 entity framework 没有很好的方法将其解析为数据库参数。它必须按原样将其发送到数据库。
总结一下:如果您传递一个字符串,它必须具有正确的格式,这样数据库才能理解文本。如果你传递 entity framework 它理解的东西并且可以从中解析出元数据,它会将它转换为数据库参数并且你不需要正确的格式,因为它不会作为纯文本发送,而是作为带有数据库参数。
为什么Linq-to-Sql不用FormattableString
的力量?可能是因为在这个特性存在之前它就被弃用了。
使用内插字符串发送 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"));
主要区别在于:$"hello {variable}"
是 而不是 字符串。这是一个FormattableString。 Entity Framework 将利用它并使用它来解析其中的参数。
String.Format
将创建一个新的格式化字符串,而没有 meta-information 已经(或应该)格式化的内容。 entity framework 没有很好的方法将其解析为数据库参数。它必须按原样将其发送到数据库。
总结一下:如果您传递一个字符串,它必须具有正确的格式,这样数据库才能理解文本。如果你传递 entity framework 它理解的东西并且可以从中解析出元数据,它会将它转换为数据库参数并且你不需要正确的格式,因为它不会作为纯文本发送,而是作为带有数据库参数。
为什么Linq-to-Sql不用FormattableString
的力量?可能是因为在这个特性存在之前它就被弃用了。