2013-05-09 106 views
0

是否可以在C#中的LINQ擴展方法中創建匿名類型?是否可以在C#中的LINQ擴展方法中創建匿名類型?

例如LINQ query.i.e。

var CAquery = from temp in CAtemp 
join casect in CAdb.sectors 
on temp.sector_code equals casect.sector_code 
select new 
{  
    //anonymous types 
    CUSIP = temp.equity_cusip, 
    CompName = temp.company_name, 
    Exchange = temp.primary_exchange  
}; 

是否支持C#中LINQ擴展方法的相同行爲?

+0

是的,是的,它是。 – 2013-05-09 17:05:42

+0

顯然,如果你想在方法之間傳遞這些匿名對象,你可能會遇到麻煩。 – spender 2013-05-09 17:07:08

+0

像[動態](http://msdn.microsoft.com/en-us/library/vstudio/dd264741.aspx)? – 2013-05-09 17:07:17

回答

3

你的意思是「使用擴展方法的語法時」?如果是這樣,絕對。您所查詢的是正是等同於:

var CAquery = CAtemp.Join(CAdb.sectors, 
          temp => temp.sector_code, 
          casect => casect.sector_code, 
          (temp, casect) => new 
          {  
           CUSIP = temp.equity_cusip, 
           CompName = temp.company_name, 
           Exchange = temp.primary_exchange  
          }); 

的C#語言規範規定了所有的譯文部分7.16。請注意,在這種情況下,你的join條款是只有後跟一個select子句,投影是Join調用內執行。否則(例如,如果你有一個where子句),編譯器將會引入透明標識符,通過一個新的匿名類型保持兩個範圍變量(tempcasect)的可用性,該類型只將它們保持在一個值中。

每個查詢表達式可表示爲非查詢表達式的代碼。查詢表達式實際上是一種預處理形式。

-1

你已經證明LINQ查詢是擴展方法。它將被編譯器簡單地轉換爲對Join擴展方法的調用。你可以創建一個匿名類型的任何地方,你可以創建任何類型,其中包括任何擴展方法裏面。

1

這樣的事情也許......

var CAquery=CATemp.Join(.....) 
        .Select(temp=>new 
          {  
          CUSIP = temp.equity_cusip, 
          CompName = temp.company_name, 
          Exchange = temp.primary_exchange  
          });