从dotnet Core 2.2.6更改为3.0.0后的EF Linq错误 - c#

我正在尝试将解决方案升级到新的Core Framework 3.0.0。
现在我有一个小问题,我不明白。

看,此方法在2.2.6中没有问题:

public async Task<IEnumerable<ApplicationUser>> GetBirthdayUsersCurrentMonth()
    {
        return await ApplicationDbContext.Users
            .Where(x => x.Gender != ApplicationUser.GenderTypes.generic)
            .Where(x => x.BirthDate.GetValueOrDefault().Month == DateTime.Now.Month)
            .Where(x => x.RetireDate == null)
            .OrderBy(x => x.BirthDate.GetValueOrDefault())
            .ToListAsync();
    }

现在在3.0.0中,我收到一个Linq错误,说:

InvalidOperationException:LINQ表达式'Where(source:Where(source:DbSet,predicate:(a)=>(int)a.Gender!= 0),谓词:(a)=> a.BirthDate.GetValueOrDefault()。Month == DateTime.Now.Month)'无法翻译。以一种可以翻译的形式重写查询,或者通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估

当我禁用此行时:

.Where(x => x.BirthDate.GetValueOrDefault().Month == DateTime.Now.Month)

错误消失了,但是我当然会吸引所有用户。而且我在此查询中看不到错误。
这可能是EF Core 3.0.0中的错误吗?

参考方案

原因是在EF Core 3中禁用了隐式客户端评估。

这意味着以前,您的代码未在服务器上执行WHERE子句。取而代之的是,EF将所有行加载到内存中并评估了内存中的表达式。

要在升级后解决此问题,首先,您需要确定EF不能完全转换为SQL的原因。我的猜测是对GetValueOrDefault()的调用,因此请尝试像这样重写它:

.Where(x => x.BirthDate != null && x.BirthDate.Value.Month == DateTime.Now.Month)

ASP.NET Core Singleton实例与瞬态实例的性能 - c#

在ASP.NET Core依赖注入中,我只是想知道注册Singleton实例是否会比注册Transient实例更好地提高性能?在我看来,对于Singleton实例,创建新对象和相关对象只需花费一次时间。对于Transient实例,此成本将针对每个服务请求重复。因此Singleton似乎更好。但是,在Singleton上使用Transient时,我们可以获得多…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

ASP.NET Core-在Singleton注入上存储库依赖项注入失败 - c#

我正在使用SoapCore为我的ASP.NET Core MVC应用程序创建Web服务。我正在使用Entity Framework Core和简单的存储库模式来获取我的数据库数据。我通过Startup.cs中的.AddSingleton()注入存储库类:services.AddSingleton<IImportRepository, ImportRep…

使EF Core 2与仅具有吸气剂的属性一起使用,而没有支持字段 - c#

我的目标是使用以下代码使Entity Framework 2更好地发挥作用:public class Foo { public Guid Id { get; } // This should NOT change public string NotRequiredProperty {get; set;} public Foo(Guid id) => I…

为什么.NET Core API中的POST参数总是为null - c#

我创建了一个简单的.NET核心控制器,并尝试从Angular查询它。问题在于,每当我向登录操作发送发布请求时,我总是会收到空参数!不过,很奇怪的是,在进行调查时,请求正文/有效负载清楚地显示了我的参数已设置。有关我的意思的示例,请参见我的屏幕截图。我已经尽了最大的努力,并且在过去的几个小时中一直在阅读类似的问题,但是没有取得任何成功?所以我的问题是:是什么导…