2010-03-06 10 views
10

Dies ist sehr verwirrend, ich AsDataView verwenden, um Abfrageergebnis an eine dgv zu binden und es funktioniert gut mit den folgenden:Bindung LINQ-Abfrage an Datagridview

var query = from c in myDatabaseDataSet.Diamond where c.p_Id == p_Id select c; 
dataGridView1.DataSource = query.AsDataView(); 

Doch diese eine führt zu einem Fehler:

var query = from item in myDatabaseDataSet.Items 
    where item.p_Id == p_Id 
    join diamond in myDatabaseDataSet.Diamond 
     on item.p_Id equals diamond.p_Id 
    join category in myDatabaseDataSet.DiamondCategory 
     on diamond.dc_Id equals category.dc_Id 
    select new 
    { 
     Product = item.p_Name, 
     Weight = diamond.d_Weight, 
     Category = category.dc_Name 
    }; 

    dataGridView1.DataSource = query.AsDataView(); 

Fehler:

Instance argument: cannot convert from 
'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 
'System.Data.DataTable' 

AsDataView zeigen sich nicht in Abfrage (List).. Warum ist das passiert? Wie bindet man die obige Abfrage an den dgv?

+0

unter diesem Link Werfen Sie einen Blick: [LINQ to Datatable] (http://weblogs.asp.net/stevesloka/archive/2008/01/28/linq-to-datatable.aspx) Sie vielleicht hier kann die Antwort finden: [Geben Sie Konvertierungsfehler mit LINQ mit einem DataSet] (http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/bce2aced-2284-498a-b206-a9203cd19937) –

Antwort

4

Die Unterschrift des AsDataView ist wie folgt:

Der einzige Parameter, der DataTable ist.

Die Abfrage Sie haben, ist eine IEnumerable eines anonymen Typs zurückkehrt, die keine implizite Umwandlung in eine Datentabelle (oder eine Folge von DataRow Instanzen, wobei in diesem Fall, dass Sie eine Datatable erstellen zu helfen, verwenden könnte).

Sie müssen die Ergebnisse zurück in eine DataTable oder etwas, das Sie in eine DataTable konvertieren können, und dann wird es funktionieren.

In Ihrem speziellen Fall scheint es, dass Sie verwendet haben (oder haben). Wenn dies der Fall ist, sollten Sie in der Lage sein, die ausgewählten Werte zu übernehmen und dann neue typisierte DataRow-Instanzen zu erstellen (es sollte Factory-Methoden für Sie geben), die dann in eine typisierte DataTable eingefügt werden können, auf die AsDataView zugreifen kann .

+0

Danke aber ich suchte nach einem einfachen Weg, einige dieser vorgefertigten Methoden funktionieren nicht. Also schätze ich, dass ich es stattdessen mit SqlCeDataReader machen werde. – DanSogaard

+0

@DanSogaard: Ich habe meine Antwort aktualisiert, um die Tatsache widerzuspiegeln, dass Sie typisierte Datensätze verwenden und wie Sie die AsDataView-Erweiterungsmethode weiterhin verwenden können. – casperOne

1

konvertieren Sie einfach das Ergebnis in eine Liste und binden Sie es an Ihr Grid.

var query = from item in myDatabaseDataSet.Items 
    where item.p_Id == p_Id 
    join diamond in myDatabaseDataSet.Diamond 
     on item.p_Id equals diamond.p_Id 
    join category in myDatabaseDataSet.DiamondCategory 
     on diamond.dc_Id equals category.dc_Id 
    select new 
    { 
     Product = item.p_Name, 
     Weight = diamond.d_Weight, 
     Category = category.dc_Name 
    }.ToList(); 
dataGridView1.DataSource = query;