我簡化LINQ Join
加上兩個表的Where
看起來是這樣的:等價查詢和方法(拉姆達)語法加入與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();
發生在我身上的一個區別是,我想知道的是命令的順序。在lambda語法連接中,我將foo.Year
屬性添加到匿名返回類型中,以便我可以過濾,而在另一個查詢中,我仍然可以在where
子句中使用foo
(和bar
,如果需要)。如果我不需要或不需要,我不需要在此處添加字段foo.Year
到我的返回類型。
不幸的是,我沒有ReSharper或類似的東西,可以將低級語句轉換爲lambda表達式,以便我可以進行比較。
我其實可以做(和利用上的語句在結構上與下一個更相似)是添加Where(..)
和ToList()
之間以下行中的第一個:
.Select(anon => new { /* the properties I want */ })
,但不與第二條語句相比,這只是增加了「多一個」匿名類型創建,或者我誤解了嗎?
總之:什麼是第二條語句的等效Join
語法?或者是第一個加上Select
加上真的等價,也就是joinQuery
在內部是否產生相同的代碼?