2011-09-14 56 views
1

1) 一)OrderBy運算符何時被調用?

var result1 = from artist in artists 
        from album in artist.Albums 
        orderby album.Title,artist.Name 
        select new { Artist_id = artist.id, Album_id = album.id }; 

被翻譯成以上查詢:

 var result = artists.SelectMany(p => p.albums 
      .Select(p1 => new { Artist = p, Album = p1 })) 
      .OrderBy(p2 => p2.Album.Title) 
      .ThenBy(p3 => p3.Artist.Name) 
      .Select(p4 => new { Artist_id = p4.Artist.id, Album_id = p4.Album.id }); 

B) 我不知道,如果這個問題會多大意義 - 如果我的假設是正確的,因此OrderBy總是被調用的最後一個操作符之一(當使用查詢表達式時),那麼我們將如何使用查詢表達式來表達下面的代碼(換句話說,我們如何在查詢表達式中指定我們想要OrderBy運算符來獲得稱爲soone r和不作爲最後的運營商之一):

 var result = artists 
      .SelectMany(p1 => p1.albums 
       .OrderBy(p2=>p2.title) 
       .Select(p3 => new { ID = p3.id, Title = p3.title })); 

2)請在下面的查詢表達式兩個orderby條款會轉換成OrderBy(... artist.Name).OrderBy(... album.Title)

 var result1 = from artist in artists 
         from album in artist.Albums 
         orderby artist.Name 
         orderby album.Title 
         select new { ...}; 

謝謝

+0

[Linqpad](http://www.linqpad.net/)非常適合這類問題。 –

+0

我檢查Linqpad它似乎直接將查詢表達式轉換爲IL代碼(我無法讀取),但它不會將它轉換成C#運算符調用 – user702769

+2

您檢查λ選項卡嗎?爲您提供從查詢語法到鏈式方法的翻譯。會幫助1a和2,而不是1b。但我看到Skeetpad已經踢了,忘了Linqpad;)。 –

回答

2

對於問題1:orderby無論你展示在哪裏都會被調用。您的查詢與您展示的內容不完全相同,但非常接近。它不會幫你格式化它,使它看起來Select被呼籲結果中的SelectMany,當它實際上是在參數來的SelectMany。您的查詢翻譯成更多的東西一樣:

var result = artists 
    .SelectMany(artist => artist.albums, (artist, album) => new {artist, album}) 
    .OrderBy(z => z.album.Title) 
    .ThenBy(z => z.artist.Name) 
    .Select(z => new { Artist_id = z.artist.id, Album_id = z.album.id } 

問題1b)中查詢大約相當於:

var result = from p1 in artists 
      from p3 in (from p2 in p1.albums 
         orderby p2.title 
         new { ID = p2.id, Title = p2.title }) 
      select p3; 

這只是一個粗略的翻譯如無查詢表達式中被轉換爲SelectMany是超載據我記憶。另一方面,它可能會以你想要的稍微簡單的方式做到:

var result = from p1 in artists 
      from p3 in p1.albums.OrderBy(p2 => p2.title) 
      select new { ID = p3.id, Title = p3.title }; 

您仍然可以在藝術家中獲得排序。它是查詢表達式和「點符號」的混合體,但對我來說看起來不錯。奇怪的是,你不使用在最終結果P1,你要知道...

對於問題2,使用兩個orderby條款你確實得到兩個OrderBy電話,這幾乎肯定是你想要什麼。你想:

var result1 = from artist in artists 
       from album in artist.Albums 
       orderby artist.Name, album.Title 
       select new { ...}; 

這將被翻譯成適當的OrderBy(...).ThenBy(...)調用。

+0

1 - 我是否正確1a),因此該查詢表達式會被翻譯成代碼「artists.SelectMany(p => p.albums ...」?2 - 「所以你的查詢大致相當於:」呃,如果你想要1a),那麼我認爲你錯了 – user702769

+1

@ user702769:肯定有一個電話給藝術家。選擇許多,是的。我的查詢相當於您的問題1b。現在回答你的問題1a。爲了將來的參考,如果你堅持每個帖子有一個問題,它會簡單得多... –

+1

@ user702769:對,現在已經編輯過 - 再看一次。 –