让我们来看一些简单的类示例:
public class Book
{
[Key]
public string BookId { get; set; }
public List<BookPage> Pages { get; set; }
public string Text { get; set; }
}
public class BookPage
{
[Key]
public string BookPageId { get; set; }
public PageTitle PageTitle { get; set; }
public int Number { get; set; }
}
public class PageTitle
{
[Key]
public string PageTitleId { get; set; }
public string Title { get; set; }
}
所以,如果我想获取所有页面标题,只知道书籍编号,我需要写几个包含语句,就像这样:
using (var dbContext = new BookContext())
{
var bookPages = dbContext
.Book
.Include(x => x.Pages)
.ThenInclude(x => x.PageTitle)//.ThenInclude(x => x.Select(y => y.PageTitle)) Shouldn't use in EF Core
.SingleOrDefault(x => x.BookId == "some example id")
.Pages
.Select(x => x.PageTitle);
}
如果我想获取与其他书籍相关联的页面标题,我需要再次重写此方法,除了BookId之外没有任何变化!这是一种非常低效的处理数据库的方式,在此示例中,我有3个类,但如果我有数百个类,嵌套到非常深的级别,那么处理起来将会非常缓慢和不舒适。
我应该如何组织与数据库的工作,以避免许多包含和冗余查询?