【发布时间】:2020-10-14 18:02:11
【问题描述】:
我使用 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)
我认为 2 个 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 Core中的string+concatnation和stringinterpolation有什么区别吗?
【问题讨论】:
-
技术上,两个查询是一样的,只是写法不同。我假设
findsList 在第二个查询执行时被清除。能不能一步一步看。 -
这里有一个细微的差别,EF Core 2.x 能够分辨出
FormattableString和string值之间的区别。这也是 EF Core 3.x 中 FromSql 被 FromSqlRaw 和 FromSqlInterpolated 取代的部分原因。
标签: asp.net entity-framework entity-framework-core