SelectMany три уровня глубоко

Я могу сгладить результаты дочернего набора в наборе с SelectMany:

 // a list of Foos, a Foo contains a List of Bars
 var source = new List<Foo>() { ... };

 var q = source.SelectMany(foo => foo.Bar)
     .Select(bar => bar.barId)
 .ToList();

это дает мне список всего Ids Панели в Списке Нечто. Когда я пытаюсь пойти три уровня глубоко, неправильный результат возвращается.

 var q = source.SelectMany(foo => foo.Bar)
     .SelectMany(bar => bar.Widget)
         .Select(widget => widget.WidgetId)
 .ToList();

Как я должен использовать SelectMany для получения списка всех Виджетов во всех Панелях в моем списке Foos?

Редактирование я сформулированный мисс вышеупомянутое предложение, но код отражает цель. Я ищу список всего Ids Виджета, не виджеты.

"Неправильным" результатом не являются все идентификаторы виджета, возвращаются.

18
задан John Saunders 14 August 2012 в 02:46
поделиться

2 ответа

Ваш запрос возвращает все идентификаторы виджета вместо всех виджетов. Если Вы просто хотите виджеты, просто используйте:

var q = source.SelectMany(foo => foo.Bar)
              .SelectMany(bar => bar.Widget)
              .ToList();

Если это все еще дает "неправильный результат", объясните, каким образом это - неправильный результат. Пример кода был бы очень полезен :)

Править: Хорошо, если Вы хотите идентификаторы виджета, Ваш исходный код должен быть прекрасным:

var q = source.SelectMany(foo => foo.Bar)
              .SelectMany(bar => bar.Widget)
              .Select(widget => widget.WidgetId)
              .ToList();

Это могло также быть записано как

var q = (from foo in source
         from bar in foo.Bar
         from widget in bar.Widget
         select widgetId).ToList();

если Вам нравится формат выражения запроса.

Это действительно должно работать - если это не работает, который предполагает, что существует что-то не так с Вашими данными.

Мы должны были проверить, прежде чем - будет это просто LINQ к Объектам, или более необычный поставщик (например, LINQ к SQL)?

33
ответ дан 30 November 2019 в 07:28
поделиться
var q = (
    from f in foo
    from b in f.Bars
    from w in b.Widgets
    select w.WidgetId
   ).ToList();

Также обратите внимание, что, если Вы хотите уникальный список, можно сделать.Distinct ().ToList () вместо этого.

2
ответ дан 30 November 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: