Как сделать соединение в linq к sql с синтаксисом метода?

Я видел много примеров в LINQ к примерам SQL о том, как сделать соединение в синтаксисе запроса, но я задаюсь вопросом, как сделать это с синтаксисом метода? Например, как я мог бы сделать следующее

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new { SomeClass = sc, SomeOtherClass = soc }

с a .Join()? Кто-либо может проиллюстрировать или обеспечить другой простой пример?

187
задан Sнаđошƒаӽ 1 January 2017 в 01:54
поделиться

2 ответа

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new { SomeClass = sc, SomeOtherClass = soc };

Будет эквивалентно:

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new
                       {
                           SomeClass = sc,
                           SomeOtherClass = soc
                       });

Как видите, когда речь идет о соединениях, синтаксис запросов обычно гораздо более читабелен, чем синтаксис лямбд.

271
ответ дан 23 November 2019 в 05:46
поделиться

Джастин правильно показал раскрытие в случае, когда за объединением просто следует select . Если у вас есть что-то еще, это становится более сложным из-за прозрачных идентификаторов - механизма, который компилятор C # использует для распространения области видимости обеих половин соединения.

Итак, чтобы немного изменить пример Джастина:

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             where sc.X + sc.Y == 10
             select new { SomeClass = sc, SomeOtherClass = soc }

будет преобразован в что-то вроде этого:

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new { sc, soc })
    .Where(z => z.sc.X + z.sc.Y == 10)
    .Select(z => new { SomeClass = z.sc, SomeOtherClass = z.soc });

z это прозрачный идентификатор - но поскольку он прозрачный, вы не можете увидеть его в исходный запрос :)

124
ответ дан 23 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

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