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();
如果我有以下 类 在 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();