Я видел много примеров в 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()
? Кто-либо может проиллюстрировать или обеспечить другой простой пример?
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
});
Как видите, когда речь идет о соединениях, синтаксис запросов обычно гораздо более читабелен, чем синтаксис лямбд.
Джастин правильно показал раскрытие в случае, когда за объединением просто следует 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
это прозрачный идентификатор - но поскольку он прозрачный, вы не можете увидеть его в исходный запрос :)