Извлечение списка из списка с помощью лямбда-выражения

#c# #entity-framework #lambda

#c# #entity-framework #лямбда

Вопрос:

Я пытаюсь извлечь список страниц из списка типа Book, где идентификатор страницы соответствует предоставленному значению.

Книга содержит список страниц. У каждой страницы есть идентификатор.

Кажется, я просто не могу понять это правильно. Любая помощь приветствуется.

 List<Book> books = GetBooks();
Page page = books.Select(x => x.Pages.Where(y => y.PageId == pageId)).Single();
  

Комментарии:

1. Вы хотите, чтобы оно вернулось IEnumerable<Page> ? У вас может быть несколько страниц с одинаковым идентификатором?

Ответ №1:

Попробуйте SelectMany :

 Page page = books.SelectMany(x => x.Pages).Where(x => x.PageId == pageId).FirstOrDefault();
  

Ответ №2:

Я думаю, вам нужно SelectMany . Это для случая, если в книге может быть несколько страниц с заданным pageId :

 var pages = books.SelectMany(book => book.Pages.Where(page => page.PageId == pageId));
  

Однако, если в книге может быть только одна страница с заданным pageId , вы можете захотеть:

 var pages = books.Select(book => book.Pages.Single(page => page.PageId == pageId));
  

Если в книге может быть или не быть страницы с заданным pageId , то вы, вероятно, хотите это:

 var pages = hooks.SelectMany(book => book.Pages).Where(x => x.PageId == pageId);
  

Ответ №3:

 List<Book> books = GetBooks();
IEnumerable<Page> pages = books.SelectMany(x => x.Pages.Where(y => y.PageId == pageId));
  

Это должно дать вам перечисление страниц с заданным идентификатором. Вам нужно добавить .ToList() , если вы хотите вместо списка.

Ответ №4:

И версия LINQ этого запроса является:

 from b in books
from p in b.Pages
where p.PageId == pageId
select p
  

Что приятно, потому что вы получаете SelectMany поведение путем детализации с from предложениями.