如何在EF Core中查詢多對多關係

asp.net-core asp.net-mvc c# entity-framework entity-framework-core

我正在使用.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”,但是,我無法弄清楚如何獲取它們的“類別”列表。

有任何想法嗎?提前致謝。

一般承認的答案

EF Core不會自動加載相關屬性,因此您需要明確地執行此操作,但以下內容應該可以解決這個問題:

var result = context.Begrip
    .Include(x => x.Categories)
    .ThenInclude(x => x.category);

請注意,intellisense並不總是可以工作。 .ThenInclude包含,但代碼仍應編譯,即使它有紅色下劃線。

如果您將其返回到視圖或API,您可能希望將其映射到DTO,這樣您就不必處理.Categories[0].category.Name等。


熱門答案

如果您需要過濾下面描述的多對多關係,我建議使用LinQ Enumerable Any方法,如下所示:

return result.Where(x => x.Categories.Any(c => c.category == categoryId));

返回由特定類別關聯的已過濾實體列表。

EntityFrameworkCore關係查詢示例



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow