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 ответ:
Первая имеет явно типизированную переменную диапазона, поэтому она фактически компилируется в:
var test2 = dt.Rows.Cast<DataRow>();
(нет необходимости
Select
это дегенерат выражения (выбора нет.)Альтернативой является вызов
AsEnumerable
изDataTableExtensions
. Я считаю, что в этом могут быть некоторые преимущества производительности, но только в некоторых случаях:var test2 = dt.AsEnumerable();