#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
предложениями.