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
,则不需要。
我正在将我的 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
,则不需要。