C# 如何使用EF core查询从多对多模型中获取一些对象?

C# 如何使用EF core查询从多对多模型中获取一些对象?,c#,.net-core,entity-framework-core,C#,.net Core,Entity Framework Core,我试着这样做: var articles = db.Articles.Include(at => at.ArticleTags) .ThenInclude(t => t.Tag) .ToList(); var articlesTag = articles.Where(a => a.ArticleTags.Tag.TagValue == "news").ToList();

我试着这样做:

var articles = db.Articles.Include(at => at.ArticleTags)
                          .ThenInclude(t => t.Tag)
                          .ToList();

var articlesTag = articles.Where(a => a.ArticleTags.Tag.TagValue == "news").ToList();
但是它不起作用。Visual Studio在a.ArticleTags.Tag.TagValue中未看到此表达式。我怎样才能把它做好

下面是所用类的实现:

public class Tag
{
    public int Id { get; set; }
    public string TagValue { get; set; }
    public List<ArticleTag> ArticleTags { get; set; }
    public List<UserTag> UserTags { get; set; }

    public Tag()
    {
        ArticleTags = new List<ArticleTag>();
        UserTags = new List<UserTag>();
    }
}

public class Article
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Summary { get; set; }
    public List<ArticleTag> ArticleTags { get; set; }

    public Article()
    {
        ArticleTags = new List<ArticleTag>();
    }
}

public class ArticleTag
{
    public int ArticleId { get; set; }
    public Article Article { get; set; }

    public int TagId { get; set; }
    public Tag Tag { get; set; }
}
基本上,Include和Include-only的作用是告诉EF在从数据库请求数据时加载这些嵌套对象。它不允许您仅仅强调ArticleTag是一个对象列表,并且您需要使用此类对象的可用方法之一。因此,在本例中,您希望将Find应用于ArticleTag列表

编辑:

请参见下面的完整示例。请注意,通过指导EF了解模型之间的关系,我甚至不需要为包含数据lat示例而烦恼

模型创建:

        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();
        }

如您所见,您可以从中间的表开始,而不需要包含chain thst来钻取数据。谢谢。但我仍然不明白如何获得所有带有相应标签的文章。你可以举一个例子,看看更新后的答案,我已经为你创建了一个完整的例子,只在内存数据库中检查。