Entity framework core 字符串参数nullable生成错误的sql查询

Entity framework core 字符串参数nullable生成错误的sql查询,entity-framework-core,c#-8.0,Entity Framework Core,C# 8.0,我将项目从ef core 2.2.6迁移到3.0.1 我的项目使用C#8.0并启用nullable,如下所示: <PropertyGroup> <LangVersion>8.0</LangVersion> <Nullable>enable</Nullable> </PropertyGroup> 执行时,将执行以下查询: var message=applicationDbContext.Foos.Where(

我将项目从ef core 2.2.6迁移到3.0.1

我的项目使用C#8.0并启用nullable,如下所示:

<PropertyGroup>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
</PropertyGroup>
执行时,将执行以下查询:

var message=applicationDbContext.Foos.Where(s=>s.Id==123.FirstOrDefault();
message=applicationDbContext.Foos.Where(s=>s.Required==“123”).FirstOrDefault();
message=applicationDbContext.Foos.Where(s=>s.Nullable==“123”).FirstOrDefault();
长id=123;
字符串代码=“123”;
message=applicationDbContext.Foos.Where(s=>s.Id==Id).FirstOrDefault();
message=applicationDbContext.Foos.Where(s=>s.Required==code.FirstOrDefault();
message=applicationDbContext.Foos.Where(s=>s.Nullable==code).FirstOrDefault();
在2.2.6中,我有这个日志

Microsoft.EntityFrameworkCore.Database.Command: Information: Executed DbCommand (56ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT TOP(1) [s].[Id], [s].[Nullable], [s].[Required]
FROM [Foos] AS [s]
    WHERE [s].[Id] = CAST(123 AS bigint)
... WHERE [s].[Required] = N'123'
... WHERE [s].[Nullable] = N'123'
... WHERE [s].[Id] = @__id_0
... WHERE [s].[Required] = @__code_0
... WHERE [s].[Nullable] = @__code_0
现在,我有这个:

... WHERE [f].[Id] = CAST(123 AS bigint)
... WHERE [f].[Required] = N'123'
... WHERE ([f].[Nullable] = N'123') **AND [f].[Nullable] IS NOT NULL**
... WHERE ([f].[Id] = @__id_0) **AND @__id_0 IS NOT NULL**
... WHERE ([f].[Required] = @__code_0) **AND @__code_0 IS NOT NULL**
... WHERE (([f].[Nullable] = @__code_0) AND ([f].[Nullable] IS NOT NULL **AND @__code_0 IS NOT NULL)) OR ([f].[Nullable] IS NULL AND @__code_0 IS NULL)**
EF对lambdas表达式中关于字符串类型不可为null的任何变量进行错误解释,并添加修改执行计划的无用参数

如何使用最新版本的ef core编写旧语法sql查询?
为什么EF Core 3.0在C#8.0环境中会检查不可能为空的参数的可空性?

有什么区别?不要强迫人们区分这两个片段只是为了找出差异<代码>([f].[Nullable]=N'123')和[f].[Nullable]不是空的将简化为
[f].[Nullable]=N'123'
,但不会影响执行计划假设我正确读取了那些太长的字符串,只有最后一个查询显示了任何差异,并且实际上是正确的。如果
@code
为null,匹配null
可为null
值的唯一方法是使用
可为null为null和@code为null
。EF Core 2.2.6要么丢失结果,要么在
code
为空时创建另一个查询。3.0中肯定有问题。考虑在GITHUB问题跟踪器中搜索/报告。@ PANAGIOTIKSANAVOS,你有理由。执行计划是相同的,甚至在条款“或”中的时间也更好。我的问题在别处。似乎1)这已经很好了,2)每日预览3.1.0-preview3.19553.2似乎没有生成额外的空检查。最新的NuGet软件包是3.1.0-preview3.19554.8,所以问题可能已经解决了。区别是什么?不要强迫人们区分这两个片段只是为了找出差异<代码>([f].[Nullable]=N'123')和[f].[Nullable]不是空的将简化为
[f].[Nullable]=N'123'
,但不会影响执行计划假设我正确读取了那些太长的字符串,只有最后一个查询显示了任何差异,并且实际上是正确的。如果
@code
为null,匹配null
可为null
值的唯一方法是使用
可为null为null和@code为null
。EF Core 2.2.6要么丢失结果,要么在
code
为空时创建另一个查询。3.0中肯定有问题。考虑在GITHUB问题跟踪器中搜索/报告。@ PANAGIOTIKSANAVOS,你有理由。执行计划是相同的,甚至在条款“或”中的时间也更好。我的问题在别处。似乎1)这已经很好了,2)每日预览3.1.0-preview3.19553.2似乎没有生成额外的空检查。最新的NuGet软件包是3.1.0-preview3.19554.8,因此问题可能已经解决