C# Net Core 3.1 Razor页面使用Linq进行多嵌套多对多查询

C# Net Core 3.1 Razor页面使用Linq进行多嵌套多对多查询,c#,linq,many-to-many,asp.net-core-3.0,asp.net-core-3.1,C#,Linq,Many To Many,Asp.net Core 3.0,Asp.net Core 3.1,我使用的是.NET Core 3.1,它与.NET Core 3.0之前的版本在Linq查询方面有一些不同,我可以收集到:。 对于早期版本的.NETCore,似乎有很多信息对我来说不太合适。 所有联接表和实体都应该正确配置,以便自动创建,所以除非有人需要查看,否则我不会全部添加它们。 鉴于这个链接,我还需要注意不要下载整个notes数据库,最终可能会有数百万行。关于跟踪或不跟踪、firstordefaultasync等方面的一些建议可能有助于解决这一问题。 @Rena在前面帮助我将这个示例用于单

我使用的是.NET Core 3.1,它与.NET Core 3.0之前的版本在Linq查询方面有一些不同,我可以收集到:。 对于早期版本的.NETCore,似乎有很多信息对我来说不太合适。 所有联接表和实体都应该正确配置,以便自动创建,所以除非有人需要查看,否则我不会全部添加它们。 鉴于这个链接,我还需要注意不要下载整个notes数据库,最终可能会有数百万行。关于跟踪或不跟踪、firstordefaultasync等方面的一些建议可能有助于解决这一问题。 @Rena在前面帮助我将这个示例用于单个多对多查询,感谢heaps 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;
        }

您需要递归地使用
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
theinlude
,因为EF将自动发出必要的联接,以便首先进行查询,因为它包含所有这些关系

同样重要的是要注意(对于像这样的深层次查询,问题会变得更加严重),例如,它不会只返回这个组中的
NoteType
s。它将返回此组中有任何
NoteType
s的
Note
s(因为这是您要查询的基本实体),以及所有相关的
NoteType
s,无论它们是否在组中。如果此组中没有关联的注释类型,则不会有注释


如果要筛选实际关系,则必须显式加载。请参阅:

Brilliant Chris,多谢各位,我已经出发跑步了。得到了我想要的记录,所有的笔记类型都在笔记类型组中。我将补充我问题的答案。一旦intellisense看到它,它就比最后的要短一些:var noteData=wait context.Note.Where(n=>n.notetypejoins.Any(ntj=>ntj.NoteType.notetypeGroupJoins.Any(ntg=>ntg.NoteTypeGroup==NoteTypeGroup)).toListSync();
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();
var noteData = await context.Note.Where(n =>
    n.NoteTypeJoins.Any(ntj =>
        ntj.NoteType.Any(nt =>
            nt.NoteTypeNoteTypeGroupJoins.Any(ntntgj =>
                ntntgj.NoteTypeGroup.Group == notetypegroup)))))
    .ToListAsync();