Подтвердить что ты не робот

Включить сбор в ядро ​​Entity Framework

Например, у меня есть эти объекты:

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; }
}

Как мне загрузить все страницы, если я знаю только BookId?

Вот как я пытаюсь это сделать:

using (var dbContext = new BookContext())
{
    var bookPages = dbContext
        .Book
        .Include(x => x.Pages)
        .ThenInclude(x => x.Select(y => y.PageTitle))
        .SingleOrDefault(x => x.BookId == "some example id")
        .Pages
        .Select(x => x.PageTitle)
        .ToList();
}

Но проблема в том, что он выдает исключение

ArgumentException: выражение свойств 'x = > {из Pages y in x select [y].PageTitle} 'недействителен. Выражение должно представлять доступ к свойствам: 't = > t.MyProperty'. При указании нескольких свойства используют анонимный тип: 't = > new {t.MyProperty1, t.MyProperty2} '. Имя параметра: propertyAccessExpression

Что не так, что я должен делать?

4b9b3361

Ответ 1

Попробуйте получить доступ к PageTitle непосредственно в ThenInclude:

using (var dbContext = new BookContext())
{
    var bookPages = dbContext
    .Book
    .Include(x => x.Pages)
    .ThenInclude(y => y.PageTitle)
    .SingleOrDefault(x => x.BookId == "some example id")
    .Select(x => x.Pages)
    .Select(x => x.PageTitle)
    .ToList();
}