#c# #entity-framework #entity-framework-core
Вопрос:
Я пытаюсь создать сгруппированную коллекцию данных (глубина 2 уровня), вот представление JSON:
[
{
Year: 2021,
Houses: [
{
HouseName: "Gryffindor",
Students: [...]
}
...
]
}
...
]
Годы, Дома и Студенты являются самостоятельными отдельными объектами.
Я пробовал использовать GroupBy()
и ToLookup()
, но они замедляют время отклика.
Моя последняя тщетная попытка была примерно такой:
- Создайте хранимую процедуру SQL, которая будет возвращать плоские строки в следующем формате:
<Year, House, StudentId, StudentName, StudentAge>
- Создайте следующие объекты, используя подход, основанный на первом коде:
class YearRow { public int Year { get; set; } public virtual ICollection<HouseSubRow> Houses { get; set; } } class HouseSubRow { public string HouseName { get; set; } public virtual ICollection<StudentInnerMostRow> Students { get; set; } public int Year { get; set; } public virtual YearRow ParentRow { get; set; } } class StudentInnerMostRow { public int StudentId { get; set; } public string StudentName { get; set; } public int StudentAge { get; set; } public string HouseName { get; set; } public virtual HouseSubRow ParentRow { get; set; } }
- В
OnModelCreating()
методе добавлены следующие конфигурации:modelBuilder.Entity<YearRow>().HasKey(x => x.Year); modelBuilder.Entity<HouseSubRow>(entity => { entity.HasKey(x => x.HouseName); entity.HasOne(x => x.ParentRow) .WithMany(x => x.Houses) .HasForeignKey(x => x.Year); }); modelBuilder.Entity<StudentInnerMostRow>(entity => { entity.HasNoKey(); entity.HasOne(x => x.ParentRow) .WithMany(x => x.Students) .HasForeignKey(x => x.HouseName); });
- Выходные данные представлены в следующем формате
[ { Year: 2021, Houses: [] // empty }, ... ]
Код не выдает никаких ошибок компиляции или выполнения, он просто не сопоставляет другие сущности.
Ожидание
Я надеялся, что этот ровный ряд
<Year, House, StudentId, StudentName, StudentAge>
будет сопоставляться с соответствующими объектами:
- Год идет за годом.
- Дом переходит в Хауссуброу
- Идентификатор студента, имя студента и возраст студента переходят в StudentInnerMostRow
Ограничения
- Не могу использовать
GroupBy()
илиToLookup()
. Оценка не должна выполняться на стороне клиента. - Невозможно создать какую-либо новую таблицу в базе данных, разрешены только представления и хранимые процедуры.
Может ли кто-нибудь сказать мне, двигался ли я в правильном направлении?
this.dbContext.YearRow.FromSqlInterpolated($"EXEC MySproc")
Комментарии:
1. Какую версию EF Core вы используете? Также
GroupBy
не обязательно это операция на стороне клиента.2. Также, пожалуйста, добавьте свой текущий запрос.
3. Также кажется, что вам нужно прочитать эту статью.
4. Я использую EF Core 3.1. Проблема с groupBy заключалась в том, что я не мог использовать GroupBy внутри GroupBy, EF Core не мог перевести не отображаемые свойства, анонимный класс, а также такие функции, как строка. Конкат().
5. Самое простое решение-использовать третий класс для sp с плоскими свойствами и использовать этот класс для выполнения сопоставлений