Запит DataColumnCollection за допомогою LINQ


76

Я намагаюся виконати простий запит LINQ щодо властивості Columns DataTable:

from c in myDataTable.Columns.AsQueryable()
    select c.ColumnName

Однак я отримую ось що:

Не вдалося знайти реалізацію шаблону запиту для типу джерела 'System.Linq.IQueryable'. "Вибрати" не знайдено. Подумайте про чітке вказівку типу змінної діапазону 'c'.

Як я можу отримати DataColumnCollection, щоб грати добре з LINQ?

Відповіді:


130

Як щодо:

var x = from c in dt.Columns.Cast<DataColumn>()
        select c.ColumnName;

3
@Dave: Що спочатку спричиняє цю проблему? Як так, що ми повинні виконати Cast ()?
Райан Шріпат,

24
Це тому, що dt.Columns - це IEnumerable, але не IEnumerable <DataColumn>. Це просто функція того факту, що клас трохи старший і не реалізує новий загальний тип. Коли ви робите <> (), ви перетворюєте на IEnumerable <T>, де визначені методи розширення.
Дейв Маркл,

15

Ви також можете використовувати:

var x = from DataColumn c in myDataTable.Columns
        select c.ColumnName

Він фактично зробить те саме, що код Дейва: "у виразі запиту явно набрана змінна ітерації перекладається на виклик Cast (IEnumerable)", відповідно до Enumerable.Cast<TResult> Methodстатті MSDN.


8

З синтаксисом методу Linq:

var x = myDataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.