Moja uprościć LINQ Join
Plus Where
z dwóch tabel wygląda następująco:Równoważność zapytania oraz sposobu (lambda) składnia Join z 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();
Ewentualnie mógłbym stosować następującą składnię, że mam nadzieję być równoważne:
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();
Jedna różnica, która występuje dla mnie i że zastanawiam się, to kolejność poleceń. W składni sprzężenia lambda dodam właściwość foo.Year
do mojego anonimowego typu zwracania, aby można było filtrować po niej, podczas gdy w drugim zapytaniu nadal mogę użyć foo
(i bar
, jeśli chcę) w klauzuli where
. Nie muszę dodawać pola foo.Year
do mojego typu zwrotu tutaj, jeśli nie chcę lub nie potrzebuję.
Niestety nie mam ReSharpera ani niczego podobnego, co mogłoby przetłumaczyć niższe wyrażenie na lambda, żeby móc je porównać.
Co mogę zrobić w rzeczywistości (i sprawiają, że górna oświadczenie bardziej podobne w strukturze do dolnej jeden) jest dodać następujący wiersz między Where(..)
i ToList()
w pierwszym:
.Select(anon => new { /* the properties I want */ })
Ale nie robi to po prostu dodaje "jeszcze jeden" anonimowy typ w porównaniu do drugiego stwierdzenia, czy też się mylę?
W skrócie: Co to jest odpowiednik składni Join
do drugiej instrukcji? Czy pierwszy i dodatkowy Select
są naprawdę ekwiwalentne, to znaczy, czy joinQuery
wewnętrznie wytwarza ten sam kod?