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 "
我正在升级 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 "