2010-12-01 65 views
3

如何將以下查詢轉換爲函數調用?我所知道的編譯器這一幕後,但不知道我怎麼會查看結果將查詢理解轉換爲LINQ中的可枚舉擴展方法

 var query = from item in Enumerable.Range(0, 10) 
        from item2 in Enumerable.Range(item, 10) 
        from item3 in Enumerable.Range(item2, 10) 
        select new { item, item2, item3 }; 
+0

您是在問「這個特定查詢到一個方法鏈的翻譯是什麼?」,或者「我怎樣才能看到LINQ查詢的方法鏈版本?」這個更一般的問題。 ? – AakashM 2010-12-01 08:02:14

回答

6

在這種情況下,它使用SelectMany,以及一個概念叫做透明標識符其保存現有的範圍變量。所以,你的查詢將轉換爲:

var query = Enumerable.Range(0, 10) 
         .SelectMany(item => Enumerable.Range(item, 10), 
            (item, item2) => new { item, item2 }) 
         .SelectMany(z => Enumerable.Range(z.item2, 10), 
            (z, item3) => new { z.item, z.item2, item3 }); 

(在這種情況下z是透明的標識符。如果有自己被一個where條款或比去年from條款後select之外的任何其他透明標識會一直介紹)。

翻譯全部在C#語言規範7.16節中描述。