Abfragen von DataColumnCollection mit LINQ

76

Ich versuche, eine einfache LINQ-Abfrage für die Columns-Eigenschaft einer DataTable durchzuführen:

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

Was ich jedoch bekomme, ist Folgendes:

Es konnte keine Implementierung des Abfragemusters für den Quelltyp 'System.Linq.IQueryable' gefunden werden. 'Auswählen' nicht gefunden. Geben Sie den Typ der Bereichsvariablen 'c' explizit an.

Wie kann ich die DataColumnCollection dazu bringen, mit LINQ gut zu spielen?

David Brown
quelle

Antworten:

130

Wie wäre es mit:

var x = from c in dt.Columns.Cast<DataColumn>()
        select c.ColumnName;
Dave Markle
quelle
3
@ Dave: Was verursacht dieses Problem überhaupt? Wie kommt es, dass wir das Cast () machen müssen?
Ryan Shripat
24
Dies liegt daran, dass dt.Columns eine IEnumerable ist, aber keine IEnumerable <DataColumn>. Es ist nur eine Funktion der Tatsache, dass die Klasse etwas älter ist und den neuen generischen Typ nicht implementiert. Wenn Sie <> () umwandeln, wandeln Sie in eine IEnumerable <T> um, in der die Erweiterungsmethoden definiert sind.
Dave Markle
14

Sie könnten auch verwenden:

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

Es wird effektiv dasselbe tun wie Daves Code: "In einem Abfrageausdruck wird eine explizit typisierte Iterationsvariable in einen Aufruf von Cast (IEnumerable) übersetzt", so der Enumerable.Cast<TResult> MethodMSDN-Artikel.

Kobra
quelle
8

Mit der Syntax der Linq-Methode:

var x = myDataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName);
MarkusE
quelle