Я борюсь с этим уже четыре дня и никакого прогресса вообще нет. Имея запрос, который прекрасно работал до обновления до EF Core 3.1:
var equipments = await this.DbContext.ServContrObjStructEquipment
.AsNoTracking()
.Where(e => e.ServContrObjStruct.ServContrObjStructParent.ServContrObjStructParent.Objectuuid == sectionGuid)
.Where(e => e.ServContrObjStructPlanEquipment.Select(x => x.PkServContrObjStructPlanEquipment).Contains(
e.ServContrObjStructPlanEquipment.OrderByDescending(x => x.ServContrObjStructPlanVers.ActiveUntil ?? DateTime.MaxValue).ThenByDescending(x => x.ServContrObjStructPlanVers.ActiveFrom).ThenByDescending(x => x.ActiveFrom).Select(x => x.PkServContrObjStructPlanEquipment).FirstOrDefault()
))
Теперь он выдает исключение, которое говорит:
Выражение LINQ 'DbSet .Where ( s3 => s3.RecStatus == 1) .Where (s3 => EF.Property> ((EntityShaperExpression: EntityType: ServContrObjStructEquipment ValueBufferExpression: (ProjectionBindingExpression: Outer.Outer. && EF.Property> ((EntityShaperExpression: EntityType: ServContrObjStructEquipment ValueBufferExpression: (ProjectionBindingExpression: Outer. => s3.PkServContrObjStructPlanEquipment) .Contains ((MaterializeCollectionNavigation (navigation: Навигация: ServContrObjStructEquipment.ServContrObjStructPlanEquipment, подзапрос: DbSet .Where (s4 = >Exha.Ser=Shere) EntityType: ServContrObjSt ructEquipment ValueBufferExpression: (ProjectionBindingExpression: Outer.Outer.Outer) IsNullable: False), "PkServContrObjStructEquipment") = NULL && EF.Property> ((EntityShaperExpression: EntityType: ServContrObjStructEquipment ValueBufferExpression: (ProjectionBindingExpression: Outer.Outer.Outer)! IsNullable: Ложные ), "PkServContrObjStructEquipment") == EF.Property> (i, "FkServContrObjStructEquipment"))) .AsQueryable () .OrderByDescending (x => x.ServContrObjStructAntilers ?? ?? 31.12.9999 23:59:59) .ThenByDescending (x => x.ServContrObjStructPlanVers.ActiveFrom) .ThenByDescending (x => x.ActiveFrom) .Select (x => x.PkServContrObjStructefirOpp)) ()) не может быть переведено. Либо переписайте запрос в форме, которую можно перевести, либо переключитесь на оценку клиента явно, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.
Мне известно, что в EF Core 3.0-3.1 произошли серьезные изменения, и теперь оценка клиента выполняется на верхнем уровне Select()
. Хотя я бы предпочел не делать этого, я попытался обзвонить всех ToList()
, AsEnumerable()
et c. чтобы он работал, но это также не помогает: запрос сложный и многоуровневый, поэтому вызов ToList()
в любой момент либо нарушает его, либо не приводит к получению связанных записей (из-за отложенной загрузки, я полагаю), которые затем необходимы для дальнейшего выполнения запроса.
Я также попытался разделить запрос на отдельные запросы, чтобы посмотреть, что там происходит, например:
var intermEquipments = await this.DbContext.ServContrObjStructEquipment
.AsNoTracking()
.Include(e => e.ServContrObjStructPlanEquipment)
.Where(e=>e.ServContrObjStruct.ServContrObjStructParent.ServContrObjStructParent.Objectuuid == sectionGuid)
.ToListAsync();
var intermEquipments1 = await this.DbContext.ServContrObjStructEquipment
.AsNoTracking()
.Include(e => e.ServContrObjStructPlanEquipment)
.Where(e => e.ServContrObjStruct.ServContrObjStructParent.ServContrObjStructParent.Objectuuid == sectionGuid)
.Select(e => e.ServContrObjStructPlanEquipment.Select(x => x.PkServContrObjStructPlanEquipment))
.ToListAsync();
var intermEquipments2 = this.DbContext.ServContrObjStructEquipment
.AsNoTracking()
.Include(e => e.ServContrObjStructPlanEquipment)
.Where(e => e.ServContrObjStruct.ServContrObjStructParent.ServContrObjStructParent.Objectuuid == sectionGuid)
.Select(e => e.ServContrObjStructPlanEquipment
.OrderByDescending(x => x.ServContrObjStructPlanVers.ActiveUntil ?? DateTime.MaxValue)
.ThenByDescending(x => x.ServContrObjStructPlanVers.ActiveFrom)
.ThenByDescending(x => x.ActiveFrom)
.Select(x => x.PkServContrObjStructPlanEquipment).ToList());
, но он либо выдает мне исключение, говоря что
Лямбда-выражение, используемое внутри Include, недопустимо
или NullReference (поскольку некоторые связанные свойства не загружены, как я уже упоминал выше) или вообще не отображает записи .
Я знаком с EntityFramework, хотя я не эксперт. Есть ли способ переписать этот запрос, чтобы он мог быть переведен или просто сделать что-нибудь, чтобы он работал? Спасибо!