LINQ - метод против разницы в синтаксисе запроса - PullRequest
9 голосов
/ 29 февраля 2012

Я работал с 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 или ссылка на сборку?)

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

1 Ответ

12 голосов
/ 29 февраля 2012

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

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

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

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

var test2 = dt.AsEnumerable();
...