2012-03-06 70 views
2

使用酒吧LINQ,我可以使用方法語法編寫更乾淨的連接嗎?

如果我想使用查詢語法加入,我會這樣做。

from a in db.authors 
join ta in db.titleauthors on a.au_id equals ta.au_id 
join t in db.titles on ta.title_id equals t.title_id 
join s in db.sales on t.title_id = s.title_id 
select new { a.au_lname, t.title1, s.qty } 

使用方法的語法

db.authors 
    .Join(db.titleauthors, 
     a => a.au_id, 
     ta => ta.au_id, 
     (a, ta) => new {a, ta}) 
    .Join(db.titles, 
     z => z.ta.title_id, 
     t => t.title_id, 
     (z, t) => new { z.a, z.ta, t }) 
    .Join(db.sales, 
     z => z.t.title_id, 
     s => s.title_id, 
     (z, s) => new { z.a, z.ta, z.t, s }) 
    .Select(z => new { z.a.au_lname, z.t.title1, z.s.qty }) 

我想知道是否有處理此行的一個優雅的方式
(z, X) => new { z.Y1, z.Y2, z.Y3... , X }

可能像
(z, X) => z.push(X)

所以我不必寫每一個興奮。

這樣的事情存在或可能嗎?

回答

3

不。基本上查詢表達式的存在是爲了讓這些東西遠離你。沒有特別簡單的模擬透明標識符的方法。

我發現當你打透明標識符時,使用查詢表達式語法幾乎總是比較乾淨的。絕對值得了解,因爲非常簡單的查詢使用方法語法更清晰,但查詢越複雜,查詢表達式越容易閱讀。

這是假設它可以全部用方法表達式表示,當然。不要忘記你可以將查詢分解成單獨的語句而不會改變含義,所以如果你需要調用沒有查詢表達式等價的方法,我有時會發現最好把它分離出來,像這樣:

var foo = from x in y 
      join a in b on x.Z equals a.Z 
      select new { a, x }; 

var bar = foo.Skip(5) 
      .Take(10) 
      .ToList(); 

我發現,比只使用括號將兩種語法形式拼湊在一起更清潔。

相關問題