2012-02-29 113 views
9

我用数据表工作,发现ReSharper的建议我可以循环转换成LINQ表达式。我这样做了,它被重写查询表达式语法(简体):LINQ - 法VS查询语法差异

var test1 = from DataRow row in dt.Rows select row; 

就个人而言,我更喜欢方法的语法所以它重写了这个:

var test2 = dt.Rows.Select(row => row); 

就坏了。

“System.Data.DataRowCollection”不包含“选择”的定义,并没有 扩展方法“选择”接受型“System.Data.DataRowCollection”的第一个参数可以找到(是否缺少使用指令或组件参考?)

由于查询表达式是translated to method calls,为什么第一个工作,但不是第二个?我预计两者兼得或两者都不可行,显然不是这样。

回答

12

首先有一个显式类型范围变量,所以它实际上编译:

var test2 = dt.Rows.Cast<DataRow>(); 

(有没有必要为Select,因为这是一个退化查询表达式(选择是无操作。)

另一种方法是调用AsEnumerableDataTableExtensions我相信有可能是在一些性能优势,但只在某些情况下:

var test2 = dt.AsEnumerable(); 
+2

这是必要的,因为'DataRowCollection'实现'IEnumerable',不'IEnumerable的'。 – 2012-02-29 16:29:08

+1

@ChrisShouts:啊,我注意到这之前,但从未完全究竟为什么突然意识到。它实现了“错误的”IEnumerable的事实是我错过了。 :) – Chris 2012-02-29 16:36:00