基本上Include 和ThenInclude 的唯一作用是告诉 EF 在从数据库中请求数据时加载这些嵌套对象。它不允许您忽略 ArticleTag 是一个对象列表这一事实,您需要使用此类对象的可用方法之一。所以在这种情况下,您想将Find 应用于ArticleTag 列表。
编辑:
请参阅下面的完整示例。请注意,通过向 EF 指示模型之间的关系,我什至不需要费心包含数据(后面的示例)。
模型创建:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Article>().HasData(
new Article { Id = 1, Summary = "Article summary 1", Title = "Article title 1" },
new Article { Id = 2, Summary = "Article summary 2", Title = "Article title 2" },
new Article { Id = 3, Summary = "Article summary 3", Title = "Article title 3" },
new Article { Id = 4, Summary = "Article summary 4", Title = "Article title 4" },
new Article { Id = 5, Summary = "Article summary 5", Title = "Article title 5" },
new Article { Id = 6, Summary = "Article summary 6", Title = "Article title 6" });
modelBuilder.Entity<Article>().HasKey(a => a.Id);
modelBuilder.Entity<Article>().HasMany(a => a.ArticleTags).WithOne(at => at.Article);
modelBuilder.Entity<Tag>().HasData(
new Tag { Id = 1, TagValue = "Tag 1" },
new Tag { Id = 2, TagValue = "Tag 2" });
modelBuilder.Entity<Tag>().HasKey(t => t.Id);
modelBuilder.Entity<Tag>().HasMany(t => t.ArticleTags).WithOne(at => at.Tag);
modelBuilder.Entity<ArticleTag>().HasData(
new ArticleTag { ArticleId = 1, TagId = 1 },
new ArticleTag { ArticleId = 2, TagId = 1 },
new ArticleTag { ArticleId = 1, TagId = 2 },
new ArticleTag { ArticleId = 2, TagId = 2 },
new ArticleTag { ArticleId = 3, TagId = 1 },
new ArticleTag { ArticleId = 4, TagId = 2 });
modelBuilder.Entity<ArticleTag>().HasKey(at => new { at.ArticleId, at.TagId });
modelBuilder.Entity<ArticleTag>().HasOne(at => at.Article).WithMany(a => a.ArticleTags);
modelBuilder.Entity<ArticleTag>().HasOne(at => at.Tag).WithMany(t => t.ArticleTags);
// Tag 1: Article 1,2,3
// Tag 2: Article 1,2,4
base.OnModelCreating(modelBuilder);
}
控制器:
public async Task<IActionResult> Index()
{
db.Database.EnsureCreated();
var articles = db.Articles.Include(at => at.ArticleTags)
.ThenInclude(t => t.Tag);
var articlesTag1 = articles.Where(a => a.ArticleTags.Any(at => at.Tag.TagValue == "Tag 1")).ToList();
var articlesTag2 = articles.Where(a => a.ArticleTags.Any(at => at.Tag.TagValue == "Tag 2")).ToList();
var articles1 = await db.ArticleTags.Include(at => at.Article)
.Include(at => at.Tag)
.Where(at => at.Tag.TagValue == "Tag 1").ToListAsync();
var articles2 = await db.ArticleTags
.Where(at => at.Tag.TagValue == "Tag 2").ToListAsync();
return View();
}
如您所见,您可以从中间表开始,使其更容易,不需要包含链 thst 将钻取数据。