LINQ-метод и различие синтаксиса запроса


Я работал с DataTable и заметил, что Resharper рекомендовал мне преобразовать цикл в выражение LINQ. Я так и сделал, и он был переписан в синтаксисе выражения запроса (упрощенном):

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

Лично я предпочитаю синтаксис метода, поэтому переписал его следующим образом:

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

И он сломался.

'Система.Данные.DataRowCollection "не содержит определения для "Select" и нет метод расширения Select, принимающий первый аргумент типа - Система.Данные.DataRowCollection " можно найти (отсутствует директива using или ссылка на сборку?)

Поскольку выражение запроса переводится в вызовы метода , Почему первый работает, но не второй? Я ожидал, что сработают либо то, либо другое, что, очевидно, не так.

1 9

1 ответ:

Первая имеет явно типизированную переменную диапазона, поэтому она фактически компилируется в:

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

(нет необходимости Select это дегенерат выражения (выбора нет.)

Альтернативой является вызов AsEnumerable из DataTableExtensions. Я считаю, что в этом могут быть некоторые преимущества производительности, но только в некоторых случаях:

var test2 = dt.AsEnumerable();