Как выполнить подзапрос для свойства навигации в EF Core? - PullRequest
0 голосов
/ 04 марта 2020

Ниже приведен мой код. Я хочу выбрать определенного c гостя из списка гостей приглашения. Но следующий код выдает следующую ошибку. Как мне этого добиться? Я видел в этом вопросе есть несколько похожих ответов, но не уверен, как его адаптировать в EF Core.

Ошибка: «Лямбда-выражение, используемое внутри Include, недопустимо.»

invitation = await _dbContext.Invitations
                                            .Include(s => s.Host)
                                            .Include(s => s.Guests.Where(g => g.GuestId.ToString().Equals(model.GuestId)))
                                            .FirstOrDefaultAsync(i => i.InvitationId.ToString().Equals(model.InvitationId));

Ответы [ 2 ]

4 голосов
/ 04 марта 2020

Другой ответ, опубликованный thatsalok, правильный, Include не может быть отфильтрован. Тем не менее, есть все еще способы достичь того, что вы хотите.

Include операторы не позволяют фильтровать, но операторы Select делают. Это означает, что вы можете попросить EF дать вам именно то, что вы хотите.

var result = await _dbContext
                       .Invitations
                       .Where(i => i.InvitationId.ToString().Equals(model.InvitationId))
                       .Select(i => new
                           {
                               Invitation = i,
                               Guest = i.Guests.FirstOrDefault(g => g.GuestId.ToString().Equals(model.GuestId))
                           })
                       .FirstOrDefaultAsync();

// demo usage
var invitation = result.Invitation;
var guest = result.Guest;

Я настоятельно советую не использовать сам класс сущности для хранения ограниченного списка, поскольку это может стать источником ошибок, если эта сущность все еще будет использоваться в контексте базы данных. Вместо этого используйте специально созданный класс DTO (или viewmodel), который содержит объекты guest и приглашения отдельно.

1 голос
/ 04 марта 2020

После использования ядра EF в течение почти года ограниченный набор записей в свойстве навигации невозможен, по крайней мере, с EntityFramework Core 3.1.

Однако есть некоторые сторонние поставщики, которые предоставляют такие возможности, как упомянутый @downernn в комментарии Включить с предложением where

Есть другое официально поддерживаемое расширение для ядра EF, вы можете просмотреть эту страницу на MSDN

...