Net Core 3.1 Razor Pages несколько вложенных запросов много ко многим с Linq - PullRequest
0 голосов
/ 07 апреля 2020

Я использую. NET Core 3.1, который имеет некоторые отличия от pre. NET Core 3.0 вокруг запросов Linq от того, что я могу собрать: https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq -queries-are-no-long- оценивали-на-клиент . Кажется, есть много информации о более ранних версиях. Net core, которые мне не совсем подходят. Все соединительные таблицы и сущности должны быть правильно настроены для автоматического создания c, поэтому я не буду добавлять их все, если кому-то не нужно их видеть. В свете этой ссылки мне также нужно быть осторожным, чтобы я не загружал всю базу данных заметок, которая в конечном итоге могла бы содержать миллионы строк. Некоторые советы по отслеживанию или отслеживанию, firstordefaultasyn c et c могут быть полезны, если это имеет значение. @Rena помогла мне с этим ранее, чтобы этот пример работал для одного запроса «многие ко многим», спасибо, Рена:

public async Task<List<Note>> GetAllNotesForNoteTypeAsync(string notetype)
        {
            var noteData = await context.Note
                    .Include(n => n.NoteNoteTypeJoins)
                        .ThenInclude(t => t.NoteType)
                    .ToListAsync();
            var noteDataWithTypes = noteData.Where(i => i.NoteNoteTypeJoins.Any(x => x.NoteType.Type.ToString() == notetype))
                    .ToList();
            return noteDataWithTypes;
        }

У меня есть еще один запрос, который идет на один уровень глубже. Эти две попытки, приведенные ниже, очевидно, не работают, но они объясняют, что я пытаюсь сделать, пытаясь отфильтровать заметки по тексту группы заметок, то есть четыре таблицы удаляются через отношения два ко многим:

public async Task<List<Note>> GetAllNotesForNoteTypeGroupAsync(string notetypegroup)
{
      var noteData = await context.Note
                .Include(n => n.NoteNoteTypeJoins)
                        .ThenInclude(t => t.NoteType)
                            .ThenInclude(gt => gt.NoteTypeNoteTypeGroupJoins)
                                .ThenInclude(g => g.NoteTypeGroup)
                    .Where(g => g.NoteTypeGroup.Group == notetypegroup)
                    .ToListAsync();

            return noteData;
        }

или :

public async Task<List<Note>> GetAllNotesForNoteTypeGroupAsync(string notetypegroup)
{
    var noteData = await context.Note
            .Select(note => new
            {
                mytypejoin = note.NoteNoteTypeJoins
                .Select(notetypejoin => new
                {
                    mynotetype = notetypejoin.NoteType
                    .Select(notetype => new
                    {
                        mynotetype = notetype.NoteTypeNoteTypeGroupJoins
                        .Select(notetypegroupjoins => new
                        {
                            mytypegroup = notetypegroupjoins
                                .Where(i => i.NoteTypeNoteTypeGroupJoins
                                    .Any(x => x.NoteTypeGroup.Group.ToString() == notetypegroup)
                        }),
                    }),
                }),
            });


    return noteData;

Любая помощь будет принята с благодарностью, я новичок в этом, спасибо!

Вот комплимент Криса:

var noteData = await context.Note.Where(n =>
                n.NoteNoteTypeJoins.Any(ntj =>
                    ntj.NoteType.NoteTypeNoteTypeGroupJoins.Any(ntg => ntg.NoteTypeGroup.Group == notetypegroup)))
                .ToListAsync();

1 Ответ

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

Вы должны будете использовать Any рекурсивно, чтобы копаться в нижних отношениях, но это становится уродливым.

var noteData = await context.Note.Where(n =>
    n.NoteTypeJoins.Any(ntj =>
        ntj.NoteType.Any(nt =>
            nt.NoteTypeNoteTypeGroupJoins.Any(ntntgj =>
                ntntgj.NoteTypeGroup.Group == notetypegroup)))))
    .ToListAsync();

Вам не нужны все Include и ThenInlude, поскольку EF автоматически выдаст необходимые объединения, чтобы в первую очередь выполнить запрос, поскольку он включает в себя все эти отношения.

Это также важно отметить (и станет более проблематичным c с запросами более глубокого уровня как это), что он не собирается просто возвращать, например, NoteType s, которые находятся в этой группе. Он вернет Note с (поскольку это базовая сущность, к которой вы обращаетесь), у которых есть какие-либо NoteType с в этой группе, с всеми связанными NoteType с, независимо от того, находятся ли они в группа или нет. У вас просто не будет заметок, где в этой группе ноль связанных типов заметок.

Если вы хотите отфильтровать фактические отношения, вам придется явно загрузить. См .: https://docs.microsoft.com/en-us/ef/core/querying/related-data#querying -связанные сущности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...