Schnellste Möglichkeit zum Füllen von DataTable aus der LINQ-Abfrage mit DataContext

7

Ich versuche, eine Linq-Abfrage auszuführen, aber ich brauche das Ergebnis als Datentabelle, da ich das verwende, um Datensätze aus verschiedenen Abfragen in demselben Viewstate-Objekt zu speichern.

Die folgenden 2 Versionen kompilieren, aber geben einen leeren Satz zurück. Der genaue Fehler ist "Der Wert darf nicht null sein. Parametername: source ". (Und ja, ich habe überprüft, dass es Daten gibt):

%Vor%

...

%Vor%

Die Beispiele in diesem thread scheint auch in dieser Situation nicht zu funktionieren.

Ich denke, ich könnte einfach einen SQL-Abfragebefehl auf die altmodische Art und Weise ausführen, aber sollte linq nicht schneller sein?

    
JumpingJezza 10.02.2011, 04:00
quelle

1 Antwort

19

Dein Problem ist das:

%Vor%

Das as -Schlüsselwort führt eine sichere Umwandlung durch, keine Umwandlung, die Sie vielleicht denken, dass sie es tut. Das as -Schlüsselwort ist semantisch das gleiche wie dies:

%Vor%

Mit Ausnahme der Version mit as wird keine Ausnahme ausgelöst, wenn das Abfrageobjekt ( IQueryable<T> , T ist ein anonymer Typ) nicht in ein IEnumerable<DataRow> (das ist esn) umgewandelt wird 't).

Leider gibt es keine integrierte Methode, von der ich weiß, dass sie einen konkreten Typ (wie in diesem Beispiel Ihr anonymer Typ) aufzählen und in ein DataTable umwandeln kann. Das Schreiben wäre nicht zu kompliziert, da Sie die Eigenschaften im Wesentlichen rekursiv abrufen müssten, um dann über die Sammlung zu iterieren und diese Eigenschaften zu verwenden, um Spalten in DataTable zu erstellen. Ich poste ein Beispiel in einigen.

In einer statischen Klasse in einem Namespace, der using ist, sollte eine ähnliche Erweiterungsmethode verwendet werden:

%Vor%     
Adam Robinson 10.02.2011, 04:14
quelle