in

EnumerableRowCollection<DataRow> ( LINQ to Dataset )

Last post 04-09-2008 23:37 by jmservera. 3 replies.
Page 1 of 1 (4 items)
Sort Posts: Previous Next
  • 04-04-2008 9:36

    • ricardo
    • Top 10 Contributor
    • Joined on 04-01-2008
    • Posts 18
    • Points 187

    EnumerableRowCollection<DataRow> ( LINQ to Dataset )

     

    Hola,

     

    Tengo problemas a la hora de asignar una sentencia LINQ a EnumerableRowCollection<DataRow> en Windows Mobile ( No lo he probado para escritorio ). ¿ Sabe alguien si es que no está implementado para Windows Mobile ?

    Gracias por anticipado.

    • Post Points: 22
  • 04-04-2008 10:00 In reply to

    • jmservera
    • Top 10 Contributor
    • Joined on 01-25-2007
    • Palma de Mallorca
    • Posts 59
    • Points 1,029

    Re: EnumerableRowCollection<DataRow> ( LINQ to Dataset )

    Tienes algún ejemplo de código? 

    Creo que en Compact Framework el método para obtener eso no está implementado, mira aquí: http://www.pluralsight.com/blogs/jimw/archive/2008/02/05/50160.aspx

     

     

    Juan M. Servera
    • Post Points: 22
  • 04-04-2008 11:20 In reply to

    • ricardo
    • Top 10 Contributor
    • Joined on 04-01-2008
    • Posts 18
    • Points 187

    Re: EnumerableRowCollection<DataRow> ( LINQ to Dataset )

    Hola,

     Según lo que entiendo es que en el CF Framework, no han implementado la operación select para el tipo EnumerableRowCollection. Yo programo actualmente en C#, y por lo menos a mi, me da un error si no le pongo select a la sentencia LINQ. El ejemplo de lo que sí le funciona, está para VB y en ella no incluye la operación select :

     Yo querría hacer algo así:

    EnumerableRowCollection<DataRow> query = from p in base1DataSet.LineaFactura where p.id > 0 select p;

     Y lo que en el enlace aparece para resolver el problema es :

    Dim selectedRows = From order In NorthwindDataSet.Orders _
    Where order.Ship_Country = "UK"

    OrdersBindingSource.DataSource = selectedRows.AsDataView()

    Me sorprende ver una sentencia LINQ sin select ... pero si a él le funciona ... igual es una de las "optimizaciones" del compilador VB respecto a C#.

    Mi objetivo es acercar lo devuelto por LINQ al enlace de controles, para minimizar la copia de datos y generación de clases nuevas, pero mi única alternativa es utilizar la sentencia .CopyToDataTable() ... y tras eso puedo enlazarlo a un DataGrid, por ejemplo, y que el grid acepte el Mapeado por el tipo de tabla. Puede que descrito sea más complicado que un código de ejemplo ( Así que lo pongo más abajo ) ... si busco alternativas es porque intuyo un exceso de consumo de recursos en el proceso ... creo que será menos óptimo que usar los miembros de las tablas de los dataset. 

    DataTable tabla = (from linea in base1DataSet.LineaFactura where linea.id > 2 select linea).CopyToDataTable();

    tabla.TableName = "LineaFactura";

    this.lineaFacturaBindingSource.DataSource = tabla;

    this.dataGrid1.DataSource = lineaFacturaBindingSource;

    Espero no haber liado las cosas más. El dataGrid1 se supone que ya tiene un estilo asignado, con las columnas que yo quiero que aparezcan. Yo podría enlazar directamente el grid al resultado LINQ, pero el problema es que no tengo capacidad de formatear las columnas ... escoge un estilo genérico. Por ello doy nombre a la tabla.

    Me preocupa que vayan a haber diferentes copias de los mismos registros en la memoria. Con los Dataset, tenía esto controlado, teniendo un solo dataset, que incluía todas las tablas, que rellenaba al principio, y luego lo que hacía era aplicar filtros en todos los casos que recuerdo, ya que no necesitaba crear diferentes vistas de las mismas tablas. Así conseguía velocidad : Siempre trabajaba en modo desconectado, atacando al dataset, porque no tenía que crear registros básicamente ... sólo consultar datos.

    Gracias por tu respuesta.

    • Post Points: 22
  • 04-09-2008 23:37 In reply to

    • jmservera
    • Top 10 Contributor
    • Joined on 01-25-2007
    • Palma de Mallorca
    • Posts 59
    • Points 1,029

    Re: EnumerableRowCollection<DataRow> ( LINQ to Dataset )

    Pues si, efectivamente el truco es utilizar el método de extensión AsDataView() que te devolvera una LinqDataView que hereda de la DataView normal. Así como tiene referencias a las filas originales te evitas la copia de datos del método CopyToDataTable. 

    var l=from linea in base1DataSet.LineaFactura where linea.id > 2 select linea;

    this.dataGrid1.DataSource=l.AsDataView();

     Al ser una DataView el Grid buscará el nombre en la tabla principal para hacer el mapping para el estilo y te funcionará correctamente.

    Juan M. Servera
    • Post Points: 5
Page 1 of 1 (4 items)
Baleares on .NET®
Powered by Community Server (Commercial Edition), by Telligent Systems