LINQ - 方法与查询语法的区别

时间:2012-02-29 16:25:19

标签: c# linq linq-query-syntax linq-method-syntax

我正在使用DataTable并注意到Resharper建议我可以将循环转换为LINQ表达式。我这样做了,它在查询表达式语法(简化)中重写:

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

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

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

它破了。

  

'System.Data.DataRowCollection'不包含'Select'和no的定义   扩展方法'select'接受类型'System.Data.DataRowCollection'的第一个参数可以找到(你是否缺少using指令或汇编引用?)

由于查询表达式是translated to method calls,为什么第一个工作但不是第二个?我希望两者都可以或者两者都不起作用,这显然不是这样。

1 个答案:

答案 0 :(得分:12)

第一个有一个显式类型的范围变量,因此它实际编译为:

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

(不需要Select,因为这是退化查询表达式(选择是无操作。)

另一种方法是从AsEnumerable拨打DataTableExtensions。我相信可能会有一些性能优势,但仅限于某些情况:

var test2 = dt.AsEnumerable();