2010-03-06 7 views
10

Ceci est très confus, j'utilise AsDataView pour lier résultat de la requête à un DGV et il fonctionne très bien avec les éléments suivants:Reliure requête LINQ to DataGridView

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

Cependant, celui-ci se traduit par une erreur:

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(); 

erreur:

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

AsDataView ne se présente pas dans la requête (Liste).. Pourquoi est-ce arrivé? Comment lier la requête ci-dessus à la dgv alors ?.

+0

Jetez un oeil à ce lien: [LINQ to DataTable] (http://weblogs.asp.net/stevesloka/archive/2008/01/28/linq-to-datatable.aspx) Peut-être ici pouvez trouver la réponse: [Tapez erreur de conversion en utilisant LINQ avec un DataSet] (http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/bce2aced-2284-498a-b206-a9203cd19937) –

Répondre

4

La signature du AsDataView est la suivante:

Le seul paramètre est le DataTable.

La requête que vous avez retourne un IEnumerable d'un type anonyme qui ne dispose pas d'une conversion implicite à un DataTable (ou une séquence d'instances DataRow, dans ce cas, vous pouvez utiliser pour vous aider à créer un DataTable).

Vous devez obtenir les résultats dans un DataTable ou quelque chose que vous pouvez convertir dans un DataTable et cela fonctionnera.

Dans votre cas particulier, il semble que vous utilisiez (ou utilisez) typed DataSets. Si c'est le cas, alors vous devriez pouvoir prendre les valeurs qui ont été choisies et ensuite créer de nouvelles occurrences DataRow typées (il devrait y avoir des méthodes d'usine pour vous) qui peuvent ensuite être placées dans un DataTable typé, sur lequel AsDataView peut être appelé .

+0

Merci mais je cherchais un moyen facile, certaines de ces méthodes prêtes à l'emploi ne fonctionnent pas. Donc je suppose que je vais le faire avec SqlCeDataReader à la place. – DanSogaard

+0

@DanSogaard: J'ai mis à jour ma réponse pour refléter le fait que vous utilisez des ensembles de données typés et comment vous pourriez toujours utiliser la méthode d'extension AsDataView. – casperOne

1

simplement convertir le résultat en une liste et le lier à votre grille.

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;