LINQ to Entities-Abfrage zu DataTable
Brauche ich zum speichern der Daten zurückgegeben, die von diesem LINQ to Entities-Abfrage (unten) in eine DataTable, so dass ich kann verwenden Sie es als Datenquelle für ein DataGridView, wie kann ich das tun?
In diesem Fall bin ich mit LINQ to Entities-Abfrage wird ein Entity Framework Modell, so db
ist eine Klasse, die erbt von System.Data.Entity.DbContext
.
using (TccContext db = new TccContext())
{
var query = from vendedor in db.Vendedores.AsEnumerable()
where vendedor.codigo == Convert.ToInt32(textBoxPesquisa.Text)
select vendedor;
//I'd like to do something like DataTable dt = query;
}
Habe ich versucht, dies zu tun (siehe unten), aber es wirft eine exception während der Ausführung [1].
using (TccContext db = new TccContext())
{
IEnumerable<DataRow> query = (IEnumerable<DataRow>)(from vendedor in db.Vendedores.AsEnumerable()
where vendedor.codigo == Convert.ToInt32(textBoxPesquisa.Text)
select vendedor);
using (DataTable dt = query.CopyToDataTable<DataRow>())
{
this.dataGridViewProcura.Rows.Add(
dt.Rows[0][0], //Código
dt.Rows[0][1], //Nome
dt.Rows[0][2]); //Venda Mensal
}
}
[1]: Exception: InvalidCastException
Unable to cast object of type 'WhereEnumerableIterator`1[Projeto_TCC.Models.Vendedor]' to type 'System.Collections.Generic.IEnumerable`1[System.Data.DataRow]'.
Vielen Dank im Voraus
InformationsquelleAutor Zignd | 2013-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine wichtige Sache hier, sind Sie Gießen Sie Ihre Linq-Abfrage (
IEnumerable<DataRow>
), wenn Sie die Auswahl dervendedor
, also gehe ich davon aus, dass vendedor ist eine Instanz vonVendedor
, so dass Ihre Abfrage zurückgeben wird eineIEnumerable<Vendedor>
Dass sollte dein problem lösen, aber auch, können Sie versuchen, mithilfe des erstellten DataTable als Datenquelle für dein DataGridView? Es wäre so etwas wie dieses:
Hoffe, ich kann helfen!
BEARBEITEN
Als eine Seite (und sehr persönliche) Bemerkung, Sie könnten versuchen, mit lambdas auf Ihre wählen Sie, Sie sehen hübscher aus 🙂
Viel sauberer, meinst du nicht?
EDIT 2
Ich habe gerade realisiert, was Sie sagte, auf CopyToDataTable für DataRow nur, so im letzten (zugegebenermaßen nicht so saubere) Lösung wäre, imitieren Sie die Logik auf den Helfer?
Nun, Dinge zu beachten:
Während dies vielleicht das Problem lösen, glaube ich nicht, das ist ein sehr guter Ansatz, aber es könnte der Anfang von eine anständige Idee 🙂
Ich hoffe, ich kann helfen, diese Zeit!
query
wenn ich es so. Bitte beachten Sie, dass ich mit Entity Framework.Ich machte einen Tippfehler auf der letzten Quelle, und als die edit sagt, die CopyToDataTable Methode funktionieren sollte es. btw - Hat die Antwort geholfen?
Wie Sie sehen können, in den gleichen link, um Zugriff auf die CopyToDataTable Methode des T-Typs in die IEnumerable<T> muss vom Typ DataRow, aber stattdessen verwendet Sie die Klasse, die die Datenbanktabelle repräsentiert Vendedor ich am Ende keinen Zugriff auf diese Erweiterung Methoden beinhaltet, dass die CopyToDataTable.
Es ist nicht gültige Lösung für die Konvertierung von Daten Tabelle
Ich habe die Umsetzung noch ein paar andere Objekt "shredder", "DataTable" - Lösungen wie die, die Sie vorschlagen, in Ihrem EDIT 2(@David Conde ), aber ich habe entdeckt, die entweder problematisch für komplexe Typen (wie bereits erwähnt) vor allem EntityTypes mit fremden Federn oder sehr teuer oder beides. Ich denke, dass in vielen Fällen ist es einfach am besten, auf Sie zu verzichten Entity-Typen und die Abfrage der DB direkt, die wandelt leicht zu einer DataTable
InformationsquelleAutor David Conde
Dies ist eine der MSDN empfohlene Lösung: https://msdn.microsoft.com/en-us/library/bb669096(v=vs. 110).aspx
Ich erfolgreich Umgesetzt
(*mit kleinen Ergänzungen zu handhaben nullable DateTime.)
wie Folgt:
}
Der (große) Nachteil dieser Lösung ist, dass es ist ** teuer** und Sie haben, um es in die Fehlerbehandlung.
InformationsquelleAutor DaniDev
können Sie setzen
var query = from ....
diese.dataGridViewProcura.Datenquelle = Abfrage.tolist()
InformationsquelleAutor NioDeTark