2016-04-13 3 views
11

Например, у меня есть эти объекты:Включить сбор в 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; } 
} 

Как я должен загрузить все PageTitles, если я знаю только 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: Выражение свойства «х => {из страниц y in x select [y] .PageTitle} 'недействителен. Выражение должно представлять доступ к собственности: 't => t.MyProperty'. При задании нескольких свойств используется анонимный тип: 't => new {t.MyProperty1, t.MyProperty2}'. Имя параметра: propertyAccessExpression

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

ответ

27

Try доступа 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(); 
} 
+9

, как это работает? Я имею в виду, когда я печатаю y.PageTitle, у меня нет поля Intellisense с помощью PageTitle, но он работает, строит! –

+1

См. Https://github.com/dotnet/roslyn/issues/8237 – Smit