LINQ — разница в синтаксисе метода и запроса

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

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

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

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

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

«System.Data.DataRowCollection» не содержит определения для «Select», и не может быть найден метод расширения «Select», принимающий первый аргумент типа «System.Data.DataRowCollection» (вам не хватает директивы using или ссылки на сборку? ?)

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


person Lester    schedule 29.02.2012    source источник


Ответы (1)


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

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

Select нет необходимости, так как это вырожденное выражение запроса (выбор не выполняется.)

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

var test2 = dt.AsEnumerable();
person Jon Skeet    schedule 29.02.2012
comment
Это необходимо, потому что DataRowCollection реализует IEnumerable, а не IEnumerable<T>. - person Chris Shouts; 29.02.2012
comment
@ChrisShouts: Ах, я замечал это раньше, но так и не понял почему. Тот факт, что он реализует неправильный IEnumerable, - это то, чего мне не хватало. :) - person Chris; 29.02.2012