EF Core 3.0 Select Projection с перегрузкой индекса (иначе .Select ((entity, index) => new {}) завершается ошибкой - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть текущая настройка с проекцией Select indexer (сущность, индекс) (см. SubRubrics). Если я опускаю индексатор, проблема решается ... Однако, если я опускаю SubRubricItems, то я могу использовать индексатор. Это только на последней выбранной проекции, которую я могу использовать, или ..?

Ниже linq проекции, сообщения об ошибках и дополнительной информации.

await _db
                        .Exams
                        .AsNoTracking()
                        .Include(exam => exam.Stations)
                        .ThenInclude(station => station.Rubrics)
                        .ThenInclude(rubric => rubric.SubRubrics)
                        .ThenInclude(subRubric => subRubric.Items)
                        .Select(exam => new Result.ExamViewModel
                        {
                            Id = exam.Id,
                            Name = exam.Name,
                            Stations = exam.Stations.Select(station => new Result.StationViewModel
                            {
                                Id = station.Id,
                                Description = station.Description,
                                Rubrics = station.Rubrics.Select(rubric => new Result.RubricViewModel
                                {
                                    Id = rubric.Id,
                                    Name = rubric.Name,
                                    Info = rubric.Info,
                                    SubRubrics = rubric.SubRubrics.Select((subRubric, index) => new Result.SubRubricViewModel
                                    {
                                        Id = subRubric.Id,
                                        Order = index,
                                        Name = subRubric.Name,
                                        Info = subRubric.Info,
                                        Type = subRubric.Type.ToString(),
                                        Items = subRubric.Items.Select(item => new Result.SubRubricItemViewModel
                                        {
                                            Id = item.Id,
                                            Name = item.Name
                                        })
                                    })
                                })
                            })
                        })
                        .ToListAsync()

Это обеспечивает эту ошибку, которую я не вижу t понимаю: /

InvalidOperationException: Processing of the LINQ expression '(MaterializeCollectionNavigation(
    navigation: Navigation: Rubric.SubRubrics,
    subquery: (NavigationExpansionExpression
        Source: DbSet<SubRubric>
            .Where(s0 => !(s0.IsDeleted))
            .Where(s0 => EF.Property<Nullable<long>>(r, "Id") != null && EF.Property<Nullable<long>>(r, "Id") == EF.Property<Nullable<long>>(s0, "RubricId"))
        PendingSelector: s0 => (NavigationTreeExpression
            Value: (EntityReference: SubRubric | IncludePaths: Items)
            Expression: s0)
    )
        .Where(i => EF.Property<Nullable<long>>((NavigationTreeExpression
            Value: (EntityReference: Rubric | IncludePaths: Version SubRubrics->...)
            Expression: r), "Id") != null && EF.Property<Nullable<long>>((NavigationTreeExpression
            Value: (EntityReference: Rubric | IncludePaths: Version SubRubrics->...)
            Expression: r), "Id") == EF.Property<Nullable<long>>(i, "RubricId")))
    .AsQueryable()
    .Select((subRubric, index) => new SubRubricViewModel{ 
        Id = subRubric.Id, 
        Order = index, 
        Name = subRubric.Name, 
        Info = subRubric.Info, 
        Type = subRubric.Type.ToString(), 
        Items = subRubric.Items
            .AsQueryable()
            .Select(item => new SubRubricItemViewModel{ 
                Id = item.Id, 
                Name = item.Name 
            }
            ) 
    }
    )' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.

Раньше это работало, пока я не добавил дополнительный SubRubricItems выбор для модели Items, он же

Items = subRubric.Items.Select(item => new Result.SubRubricItemViewModel
                                        {
                                            Id = item.Id,
                                            Name = item.Name
                                        })

Для справки, это модель представления это проецируется в:

public sealed class Result
        {
            public IEnumerable<ExamViewModel> Exams { get; set; }

            public sealed class ExamViewModel
            {
                public long Id { get; set; }
                public string Name { get; set; }
                public IEnumerable<StationViewModel> Stations { get; set; }
            }

            public sealed class StationViewModel
            {
                public long Id { get; set; }
                public string Description { get; set; }
                public IEnumerable<RubricViewModel> Rubrics { get; set; }
            }

            public sealed class RubricViewModel
            {
                public long Id { get; set; }
                public string Name { get; set; }
                public string Info { get; set; }
                public IEnumerable<SubRubricViewModel> SubRubrics { get; set; }
            }

            public sealed class SubRubricViewModel
            {
                public long Id { get; set; }
                public int Order { get; set; }
                public string Name { get; set; }
                public string Info { get; set; }
                public string Type { get; set; }
                public IEnumerable<SubRubricItemViewModel> Items { get; set; }
            }

            public sealed class SubRubricItemViewModel
            {
                public long Id { get; set; }
                public int Order { get; set; }
                public string Name { get; set; }
                public string Info { get; set; }
                public string Type { get; set; }
            }
        }

1 Ответ

1 голос
/ 08 апреля 2020

Это не может быть переведено на SQL. Так что либо выполните запрос SQL перед .Select(),

.ThenInclude(subRubric => subRubric.Items)
.AsEnumerable()
.Select(exam => new Result.ExamViewModel

, либо удалите Include s (они ничего не делают, когда у вас есть пользовательская проекция, и тем самым измените запрос)

SubRubrics = rubric.SubRubrics.Select((subRubric) => new Result.SubRubricViewModel
{
    Id = subRubric.Id,
    Order = 0, . . .

и заполните свойство Order на моделях представления впоследствии.

...