Entity Framework 版本之间生成的查询不同

Generated Query is different between versions of Entity Framework

我正在升级 Entity Framework 并已成功从 v5(但由于我们使用的是 .NET 4.0,程序集实际上是 v4.4)升级到最新版本的 v6。我们 运行 遇到一个问题,即 EF5 和 EF6 以不同的方式生成相同的 IQueryable,结果不同。

LINQ 查询是: Context.MyTable.SingleOrDefault(x => x.StringProperty != "");

在 EF5 中,SQL 看起来像这样(稍微简化了一点):

SELECT TOP (2) ID AS ID, StringProperty AS StringProperty FROM MyTable WHERE N'' <> StringProperty

而在 EF6 中,SQL 看起来像:

SELECT TOP (2) ID AS ID, StringProperty AS StringProperty FROM MyTable WHERE NOT((N'' = StringProperty) AND (StringProperty IS NOT NULL))

如果 StringProperty 为空,EF5 查询不会 return 该行,而 EF6 版本会。我没有在任何地方看到这个记录(不完全确定在哪里看)。这个例子很容易修复,虽然很难找到。有没有办法打开遗留行为?

更重要的是,我想知道是否还有类似这样的任何其他更改,其中以不同的方式生成查询会导致不同的查询结果。 EF6 中是否有重大更改列表?

> Is there a way to turn on the legacy behavior?

这个post、NULL value handling in Entity Framework应该会有一些帮助。

"DbContext.ContextOptions.UseCSharpNullComparisonBehavior 开关,当值可以为 null 时,它将自动将 NULL 比较逻辑嵌入到您的 Entity Framework 查询中"

"In EF5, the UseCSharpNullComparisonBehavior flag defaults to false. EF6.0 introduced a breaking change where the flag defaults to true "