Вложенный «из» запроса LINQ, выраженный с помощью методов расширения

Как написать этот запрос LINQ с помощью синтаксиса метода расширения?

var query = from a in sequenceA from b in sequenceB select ...; 

Для вашей будущей ссылки на все вопросы этой формы отвечает раздел 7.16 спецификации C #.

На ваш конкретный вопрос отвечает этот параграф:


Выражение запроса с предложением second from блока, за которым следует предложение select

 from x1 in e1 from x2 in e2 select v 

переводится на

 ( e1 ) . SelectMany( x1 => e2 , ( x1 , x2 ) => v ) 

Таким образом, ваш запрос:

 var query = from a in sequenceA from b in sequenceB select ...; 

Такой же как

 var query = ( sequenceA ) . SelectMany( a => sequenceB , ( a , b ) => ... ) 

(Обратите внимание, что, конечно, это предполагает, что «…» является выражением, а не, скажем, выражением, сопровождаемым продолжением запроса.)

Ответ hdv указывает, что

 var query = ( sequenceA ) . SelectMany( a => ( sequenceB ) . Select( b => ... ) ); 

также будет логически обоснованным переводом, хотя это не перевод, который мы фактически выполняем. В первые дни реализации LINQ это был перевод, который мы выбрали. Однако, поскольку вы накладываете больше на предложения, это делает гнездо ягнят все более и более глубоким, что затем представляет компилятор с огромной проблемой в выводе типа. Этот выбор производительности компилятора сокращает количество переводов, поэтому мы внедрили прозрачный механизм идентификатора , чтобы дать нам гораздо более дешевый способ представить морскую среду глубоко вложенных областей.

Если эти предметы вас интересуют:

Для получения дополнительной информации о том, почему глубоко вложенные лямбды представляют трудную проблему для решения компилятора, см.

http://blogs.msdn.com/b/ericlippert/archive/2007/03/26/lambda-expressions-vs-anonymous-methods-part-four.aspx

http://blogs.msdn.com/b/ericlippert/archive/2007/03/28/lambda-expressions-vs-anonymous-methods-part-five.aspx

Для получения дополнительной информации о прозрачных идентификаторах см. Этот пост от Wes Dyer, который реализовал их в C # 3.0:

http://blogs.msdn.com/b/wesdyer/archive/2006/12/22/transparent-identifiers.aspx

И моя серия статей о них:

http://ericlippert.com/2014/07/31/transparent-identifiers-part-one/

 var query = sequenceA.SelectMany(a => sequenceB.Select(b => ...)); 

Редактировать : как отметил Эрик Липперт в комментариях, это дает те же результаты, но намеренно не так, как оно переведено внутренне. См. Его ответ на другой способ вызова SelectMany , который соответствует оригиналу. Кроме того, для ясности добавлено опущенное b => .

Другой способ написать это:

 var query = a.Join(b, i => new { }, j => new { }, (i, j) => new { i = i, j = j }); 
  • Запрос базы данных Microsoft Access MDB с использованием LINQ и C #
  • LINQ to Entities не распознает метод Int32 get_Item (Int32)
  • Пересечение нескольких списков с помощью IEnumerable.Intersect ()
  • Динамическое предложение WHERE в LINQ
  • Linq «Не удалось перевести выражение ... в SQL и не смог обработать его как локальное выражение».
  • Как я могу сортировать строку текста, за которой следует число, используя LINQ
  • Запрос LINQ, чтобы найти элементы в списке, содержащиеся в другом списке
  • NHibernate vs LINQ to SQL
  • Множественный «порядок по» в LINQ
  • Использование LINQ для удаления элементов из списка
  • Рекурсивная иерархия - рекурсивный запрос с использованием Linq
  • Interesting Posts

    Как получить нить и кучу дампа процесса Java в Windows, который не работает в консоли

    Как очистить кеш gradleации?

    map set / get запросы в C ++ class / структура изменений

    Что такое безопасный тип?

    Имя «XYZ» не существует в пространстве имен «clr-namespace: ABC»

    Есть ли причина объявлять ivars, если вы используете свойства исключительно в Objective-C?

    Почему конструктор суперclassа вызывается, когда мы объявляем объект подclassа? (Ява)

    Есть ли способ предоставить разрешения на чтение и запись себе для системных файлов на Mac OSX 10.11.2

    Можно ли использовать ShowDialog без блокировки всех форм?

    MongoDB – как запросить вложенный элемент внутри коллекции?

    Как получить доступ к системному лотку с помощью клавиатуры?

    Как вернуться к работе с ПК с Windows 7, у которого нет учетной записи администратора?

    Проблема с двойным слоем DVD + R – Ошибка ввода-вывода

    Беспроводной маршрутизатор, поддерживающий Bonjour между проводными и беспроводными устройствами

    Извлечение версии программного обеспечения Android

    Давайте будем гением компьютера.