Мой упрощенный LINQ Join
plus Where
из двух таблиц выглядит следующим образом:
var join = context.Foo
.Join(context.Bar,
foo => new { foo.Year, foo.Month },
bar => new { bar.Year, bar.Month },
(foo, bar) => new { foo.Name, bar.Owner, foo.Year })
.Where(anon => anon.Year == 2015).ToList();
В качестве альтернативы я мог бы использовать следующий синтаксис, который, я надеюсь, будет эквивалентным:
var joinQuery = from foo in context.Foo
join bar in context.Bar
on new { foo.Year, foo.Month } equals new { bar.Year, bar.Month }
where foo.Year == 2015
select new { foo.Name, bar.Owner };
var join = joinQuery.ToList();
Одна разница, которая возникает у меня, и что я задаюсь вопросом, это порядок команд. В соединении лямбда-синтаксиса я добавляю свойство foo.Year
к моему типу анонимного возврата, чтобы я мог фильтровать его, а в другом запросе я все еще могу использовать foo
(и bar
, если захочу) в Where
. Мне не нужно добавлять поле foo.Year
к моему типу возврата здесь, если я не хочу или нуждаюсь.
К сожалению, у меня нет ReSharper или чего-то подобного, что могло бы преобразовать нижний оператор в лямбда-код, чтобы я мог сравнивать.
То, что я мог на самом деле (и сделать верхний оператор более похожим по структуре на нижний), добавляет следующую строку между Where(..)
и ToList()
в первом:
.Select(anon => new { /* the properties I want */ })
Но разве это не просто добавляет "еще одно" создание анонимного типа по сравнению со вторым утверждением, или я ошибаюсь здесь?
Вкратце: какой эквивалентный синтаксис Join
для второго оператора? Или первый, плюс добавленный Select
действительно эквивалентный, т.е. Внутри joinQuery
создает тот же код?