2010-03-06 13 views
10

Esto es muy confuso, yo uso AsDataView de obligar resultado de la consulta a un vgd y funciona bien con lo siguiente:Encuadernación LINQ consulta a DataGridView

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

Sin embargo, este resultado en un error:

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

error:

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

AsDataView no aparece en la consulta (Lista).. ¿Por qué sucede esto? ¿Cómo vincular la consulta anterior al dgv?

+0

Echa un vistazo a este enlace: [LINQ a DataTable] (http://weblogs.asp.net/stevesloka/archive/2008/01/28/linq-to-datatable.aspx) Tal vez aquí se puede encontrar la respuesta: [Escriba el error de conversión usando LINQ con un DataSet] (http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/bce2aced-2284-498a-b206-a9203cd19937) –

Respuesta

4

La firma del AsDataView es como sigue:

El único parámetro es la DataTable.

La consulta tiene devuelve un IEnumerable de un tipo anónimo que no tiene una conversión implícita a un DataTable (o una secuencia de DataRow casos, en cuyo caso se podría utilizar eso para ayudarle a crear un DataTable).

Necesita obtener los resultados nuevamente en una DataTable o algo que pueda convertir en una DataTable y luego funcionará.

En su caso particular, parece que estaba (o está) usando typed DataSets. Si ese es el caso, entonces debería poder tomar los valores que se seleccionaron y luego crear nuevas instancias dañadas de DataRow (debe haber métodos de fábrica para usted) que luego se pueden poner en una DataTable con tipo, a la que se puede llamar AsDataView. .

+0

Gracias pero estaba buscando una manera fácil, algunos de estos métodos listos no funcionan. Así que supongo que lo haré con SqlCeDataReader. – DanSogaard

+0

@DanSogaard: actualicé mi respuesta para reflejar el hecho de que está utilizando conjuntos de datos tipados y cómo puede ser que todavía pueda utilizar el método de extensión AsDataView. – casperOne

1

simplemente convierta el resultado en una lista y vincúlelo a su grilla.

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;