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来钻取数据。谢谢。但我仍然不明白如何获得所有带有相应标签的文章。你可以举一个例子,看看更新后的答案,我已经为你创建了一个完整的例子,只在内存数据库中检查。