2013-05-09 73 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  
          });