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