2009-04-29 88 views
9

想知道是否有任何方法可以獲得LINQ「查詢」語法表達式產生的lambda表達式。將LINQ查詢語法轉換爲Lambda

考慮:

var query = from c in dc.Colors 
      where c.ID == 213 
      orderby c.Name, c.Description 
      select new {c.ID, c.Name, c.Description }; 

有沒有什麼辦法讓生成的 「拉姆達」 代碼/體現在哪裏?

var query = dc.Colors 
    .Where(c => c.ID == 213) 
    .OrderBy(c => c.Name) 
    .ThenBy(c => c.Description) 
    .Select(c => new {c.ID, c.Name, c.Description, }); 

我知道這些是非常簡單的例子,並且C#編譯器從所述查詢表達式編譯代碼時生成一個lambda表達式。有什麼方法可以獲得該表達的副本嗎?

我希望能夠將此作爲一個訓練工具,用於我的一些團隊成員對lambda表達式不太熟悉。另外,我使用了Linq Pad,但理想情況下,這可以在沒有第三方工具的情況下實現。

回答

5

只需進入:

string lambdaSyntax = query.Expression.ToString(); 

相比LINQPad的缺點是,結果被格式化所有一行。

+0

這會產生與您在裝配體上使用反射器時發現的結果類似的結果。所有針對瘋狂命名匿名類型的靜態方法調用。不理想。 – andleer 2009-05-01 17:26:29

3

您可以嘗試編譯程序集,然後使用Reflector查看它。

這可能比你想要的要複雜一點,因爲編譯器會將事情編譯到直接方法調用中(所有東西都是靜態方法調用,而不是擴展方法,並且lambda將被編譯成它們自己的這通常被稱爲像<ClassName>b_88f)功能

你一定會弄清楚是怎麼回事,雖然:-)

+0

反射器是一個奇妙的工具!獎金點,因爲您可以使用它來查看.net代碼幾乎任何.net程序集。 – 2009-05-01 01:27:36

2

ReSharper具有該功能。它將採用LINQ到Lambda,並在密鑰的中風處再次返回。對其他事情也非常(非常)有用。

+0

真的想避免使用第三方工具。 – andleer 2009-04-30 03:15:35