EF Core 多对多 linq 查询

EF Core many-to-many linq query

如果我有以下 类 在 EF Core 中映射多对多关系:

public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public Author Author { get; set; }
    public ICollection<BookCategory> BookCategories { get; set; }
}  
public class Category
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public ICollection<BookCategory> BookCategories { get; set; }
}  
public class BookCategory
{
    public int BookId { get; set; }
    public Book Book { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

从 Book 实例获取 List<Category> 的最佳做法是什么? 在 EF6 中,我只能查询 Book.Categories

如果您使用的是 EF Core 5.0 或更高版本,则不再需要 BookCategory 实体。您可以简单地使用 ICollection<Category> / ICollection<Book>,就像使用 Entity Framework 6.

一样
public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public Author Author { get; set; }
    public ICollection<Category> Categories { get; set; }
}  
public class Category
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public ICollection<Book> Books { get; set; }
}  

对于 EF Core 3.1 或更早版本——这是支持 .NET Framework 的最后一个版本,因此你可能会坚持使用它——你将需要包含两个级别的导航属性,然后 select其中的类别列表:

Book book = await context.Books
    .Include(b => b.BookCategories).ThenInclude(c => c.Category)
    .First(b => b.Id == 42);

List<Category> bookCategories = book.Categories
    .Select(c => c.Category)
    .ToList();