13

Я переношу свой код .NET Framework (EF6) в ядро ​​ASP.NET (EF Core), и я наткнулся на эту проблему. Вот несколько примеров коды:Использование EF Core ThenInclude() на таблицах соединений

В EF6 я использую Включить() и Select() для нетерпеливой-загрузки:

return _context.Post 
.Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests)) 

PostAuthor представляет собой таблицу стыка, и есть таблица Junction «AuthorInterest», который я не нужно было включать в EF6 (Select переходит прямо в a.Interests).

В любом случае, я вижу, что в EF7 это переработано, что означает, что я должен использовать ThenInclude() для вложенных запросов сейчас. Однако ...

return _context.Post 
    .Include(p => p.PostAuthor) 
    .ThenInclude(pa => pa.Select(pa2 => pa2.Author)) 
...etc 

Вышеприведенный код не работает из-за оператора Select(). Документация на https://docs.efproject.net/en/latest/querying/related-data.html, по-видимому, предполагает, что мне она не нужна, и я могу сразу обратиться к автору, но я получил ICollection в последней лямбда, поэтому мне явно нужен Select(). Я прохожу через несколько таблиц соединений далее в запросе, но для простоты, давайте просто сосредоточимся на первом.

Как это сделать?

ответ

22

, но я получаю ICollection в последнем лямбда отображается, так что я, очевидно, нужен Select()

Нет, вы не знаете. EF Core Include/ThenInclude полностью заменить необходимость использования Select/SelectMany в EF6. Оба они имеют отдельные перегрузки для свойств навигации для сбора и ссылочного типа. Если вы используете перегрузку с коллекцией, ThenInclude работает с типом коллекции элемент, поэтому в конце вы всегда получаете единый тип сущности.

В вашем случае pa должен разрешить тип элемента соединительной таблицы, поэтому Author должен быть непосредственно доступен.

для экземпляра EF6 включает цепь:

.Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests)) 

переводит к EF Core:

.Include(p => p.PostAuthor).ThenInclude(pa => pa.Author).ThenInclude(a => a.Interests) 
+4

Вау, спасибо. Очень странно - Visual studio не даст мне intellisense для pa.Author (вместо этого предлагает некоторые методы Linq) и будет подчеркивать все с красным, как только я попытаюсь написать его. После вашего поста я проигнорировал VS и после компиляции все работало как шарм. – nikovn

+1

Это странно. Я использую VS2015 Update 3, и когда я пишу что-то вроде 'db.Parents.Include (p => p.Children) .ThenInclude (c => c.Child) .ThenInclude (c => c.Parents)' I получите правильную поддержку Intellisense на каждой лямбда. –

+0

VS2015 Ultimate Update 3 здесь тоже. Не слишком удивлен, у меня есть другие ошибки в основных проектах - например, когда я выбираю элемент, предложенный intellisense, он записывает символы в середине файла и т. Д. Возможно, это плагины ... – nikovn

Смежные вопросы