Ваш запрос возвращает все идентификаторы виджетов, а не все виджеты. Если вам нужны только виджеты, просто используйте:
var q = source.SelectMany(foo => foo.Bar)
.SelectMany(bar => bar.Widget)
.ToList();
Если это все еще дает "неправильный результат", пожалуйста, объясните, каким образом way это неправильный результат. Пример кода будет очень полезен:)
РЕДАКТИРОВАТЬ: Хорошо, если вы хотите идентификаторы виджета, ваш оригинальный код должен быть в порядке:
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 to Objects или более интересный поставщик (например, LINQ to SQL)?