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?

Antworten:


130

Wie wäre es mit:

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

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.


8

Mit der Syntax der Linq-Methode:

var x = myDataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.