我正在使用.NET Core和EF Core进行Web项目。我正在努力如何查询多对多的关系。这就是我的模型:
public class Begrip
{
public int ID { get; set; }
public string Name { get; set; }
public string Desc { get; set; }
[Url]
public string URL { get; set; }
public ICollection<BegripCategory> Categories { get; set; }
}
public class Category
{
public int ID { get; set; }
public string Name { get; set; }
public ICollection<BegripCategory> Begrippen { get; set; }
}
public class BegripCategory
{
public int begripId { get; set; }
public Begrip begrip { get; set; }
public int categoryId { get; set; }
public Category category { get; set; }
}
我的数据库上下文:
public class PBBContext : DbContext
{
public PBBContext (DbContextOptions<PBBContext> options)
: base(options)
{
}
public DbSet<PBB.Models.Movie> Movie { get; set; }
public DbSet<PBB.Models.Begrip> Begrip { get; set; }
public DbSet<PBB.Models.Category> Category { get; set; }
public DbSet<PBB.Models.BegripCategory> BegripCategory { get; set; }
protected override void OnModelCreating(ModelBuilder modelbuilder)
{
modelbuilder.Entity<BegripCategory>().HasKey(bc => new { bc.begripId, bc.categoryId });
modelbuilder.Entity<BegripCategory>().HasOne(b => b.begrip).WithMany(bg => bg.Categories).HasForeignKey(bc => bc.begripId);
modelbuilder.Entity<BegripCategory>().HasOne(c => c.category).WithMany(ca => ca.Begrippen).HasForeignKey(cc => cc.categoryId);
}
}
我想要做的是在JSON结果中返回所有“Begrippen”以及所有相应的“类别”,但是,我无法弄清楚如何获取它们的“类别”列表。
有什么想法吗?提前致谢。
答案 0 :(得分:14)
EF Core不会自动加载相关属性,因此您需要明确地执行此操作,但以下内容应该可以解决这个问题:
var result = context.Begrip
.Include(x => x.Categories)
.ThenInclude(x => x.category);
注意,智能感知目前并不总是适用于.ThenInclude
,但代码仍应编译,即使它有红色下划线。
如果您将此内容返回到视图或API,您可能希望将其映射到DTO,这样您就不必处理.Categories[0].category.Name
等。
答案 1 :(得分:4)
如果您需要过滤下面描述的多对多关系,我建议使用 LinQ Enumerable Any方法,如下所示:
return result.Where(x => x.Categories.Any(c => c.category == categoryId));
返回由特定类别相关的已过滤实体列表。
答案 2 :(得分:1)
扩展@ Richard的答案:
当我执行以下操作时,我在Visual Studio 2017 15.5.6中注意到了:
return _context.Begrip
.Include(x => x.Categories)
.ThenInclude(y => y.<nothing typed in here yet>)
IntelliSense首先告诉我 y ,如果类型 ICollection 的 BegripCategory 提出适合收藏的方法,那会让我感到困惑,尤其是当我开始打字&#34;类别&#34; (取代&#34;此处未输入任何内容&#34;)IntelliSense更改,好像我们只处理单个实例而不是 ICollection
只是一个小小的评论,但我希望它能帮助节省几分钟时间的混乱。