Asp.net EF Core中的字符串concat和字符串插值之间有什么区别吗?

Asp.net EF Core中的字符串concat和字符串插值之间有什么区别吗?,asp.net,entity-framework,entity-framework-core,Asp.net,Entity Framework,Entity Framework Core,我使用asp.net core 2.1和EF core 2。 我调用了FromSql来使用原始查询。但出现了一些奇怪的结果 var finds = db.JournalInfos.FromSql<JournalInfo>($"SELECT * FROM `journalinfos` WHERE `journalinfos`.`Date` LIKE '{dateKey}%' ORDER BY `Index`").ToList(); var b = finds.Cou

我使用asp.net core 2.1和EF core 2。 我调用了FromSql来使用原始查询。但出现了一些奇怪的结果

var finds = db.JournalInfos.FromSql<JournalInfo>($"SELECT * FROM `journalinfos` WHERE `journalinfos`.`Date` LIKE '{dateKey}%' ORDER BY `Index`").ToList();
var b = finds.Count(); //the count is 0 (It can't count noramlly)

var test = db.JournalInfos.FromSql<JournalInfo>("SELECT * FROM `journalinfos` WHERE `journalinfos`.`Date` LIKE '" + dateKey + "%' ORDER BY `Index`").ToList();
var a = test.Count(); //but in here, the count is normal (1054)
我认为两个sql字符串之间没有任何区别

我尝试更改这两条语句的顺序,以查看在同一实体上调用FromSql两次是否有问题,但结果是一样的。一个使用字符串插值,另一个使用+连接字符串

正如您在上面看到的,他们的string.Equal结果也是一样的。 但在使用字符串插值的情况下,它不会返回有效计数 但如果我使用字符串变量存储每个值并将其传递给每个FromSql参数,那么它们的查询结果是相同的。有效的

string sql1 = $"SELECT * FROM `journalinfos` WHERE `journalinfos`.`Date` LIKE '{dateKey}%' ORDER BY `Index`";
var finds = db.JournalInfos.FromSql<JournalInfo>(sql1).ToList();
var b = finds.Count(); //Now, it can count normally (1054)

string sql2 = "SELECT * FROM `journalinfos` WHERE `journalinfos`.`Date` LIKE '" + dateKey + "%' ORDER BY `Index`";
var test = db.JournalInfos.FromSql<JournalInfo>(sql2).ToList();
var a = test.Count(); //Also too. (1054)
在c或EF核心中,字符串+凝聚和字符串插值之间有什么区别吗?

插值字符串 插入的字符串可以转换为call String.Format。将其存储在字符串变量中时会发生这种情况:

字符串sql1=$。。。; var finds=db.JournalInfos.fromsql1; 但是,如果像在屏幕截图中一样直接传递插值字符串,则根据and,它将是FormattableString类型:

var finds=db.JournalInfos.FromSql$。。。; 在第二种情况下,数据库提供程序格式化查询并转义危险字符以避免SQL注入攻击。如果您想找出确切的差异,您必须在EF Core中启用敏感数据日志记录以查看实际查询

LINQ方法 对于这个特定的问题,可能有比使用原始SQL查询更简单的解决方案。LINQ扩展方法被编译成SQL,在SQL注入方面是安全的,并且在数据库模型发生变化时更易于维护

日期时间日期;//这与屏幕截图上第1603行中的变量相同 DateTime minInclusive=新的DateTimedate.Year,date.Month,1; DateTime maxExclusive=minInclusive.AddMonths1; var finds=db.JournalInfos .Wherejournal=>journal.Date>=minInclusive&&journaljournal.Index 托利斯特先生;
从技术上讲,两个查询都是相同的,只是编写方式不同。我假设在执行第二个查询时正在清除finds列表。你能一步一步地看吗?这里的封面下有一个细微的差别,EF Core 2.x能够分辨FormattableString和string值之间的差别。这就是为什么在EF Core 3.x中FromSql被FromSqlRaw和FromSqlInterpolated替换的部分原因。