EF 版本从 2.1 更新到 3.1.22 中断了 Linq

EF version updated to 3.1.22 from 2.1 breaks Linq

我正在将我的 ASP.NET Core Web API 项目从 .NET Core 2.1 升级到 3.1。我还需要将 EF Core 从 2.1 升级到 3.1。

升级 EF 后,在 .NET Core 2.1 中工作的 Linq 查询无法工作(可能是新版本不支持向后兼容性或使用 Linq 的更改)。

重写 linq 查询以使其正常运行的标准方法是什么? linq 中的哪些内容从 2.1 更改为 3.1?该问题与 select 子句有关,该子句具有与 ANY() 等相关的操作

    var classes =
        (
            from z in Context.aaa.Where(x => x.Id == Id)
            join b in Context.bbb on z.Id equals b.Id
            join bc in Context.ccc.Where(x => x.IsActive == true) on b.Id equals bc.Id
            join fcc in Context.ddd.Where(x => x.IsActive == true) on bc.Id equals fcc.Id
            join fc in Context.eee.Where(x => x.IsActive == true )
                .Include(i => i.Level) on fcc.Id equals fc.Id
            select new
            {
                bc.IsUserRequired,
                IsHiddenByOverrideOrExclusion = zoneList.Any(x => x.Id == fc.Id && x.IsHidden == true) || (!zoneList.Any(x => x.Id == fc.Id && x.IsHidden == false) && functioncheckFlag(fc, Id, category)),
            }
        ).Distinct().AsEnumerable();

EF Core 3.x 已更改翻译行为。 EF Core 不再在客户端静默处理数据。因此翻译将失败,因为 functioncheckFlag 无法转换为 SQL,如果 zoneList 是本地集合,也可能 zoneList.Any

要解决问题,您必须在客户端执行 Distinct

var classes =
    (
        from z in Context.aaa.Where(x => x.Id == Id)
        join b in Context.bbb on z.Id equals b.Id
        join bc in Context.ccc.Where(x => x.IsActive == true) on b.Id equals bc.Id
        join fcc in Context.ddd.Where(x => x.IsActive == true) on bc.Id equals fcc.Id
        join fc in Context.eee.Where(x => x.IsActive == true ) on fcc.Id equals fc.Id
        select new
        {
            bc.IsUserRequired,
            IsHiddenByOverrideOrExclusion = zoneList.Any(x => x.Id == fc.Id && x.IsHidden == true) || (!zoneList.Any(x => x.Id == fc.Id && x.IsHidden == false) && functioncheckFlag(fc, Id, category)),
        }
    )
    .AsEnumerable()
    .Distinct();

也删除了 Include,如果查询末尾有 Select,则不需要。