Riempimento di un DataSet o DataTable da un set di risultati della query LINQ


137

Come si espone una query LINQ come servizio Web ASMX? Di solito, dal livello aziendale, posso restituire un tipo DataSeto DataTableche può essere serializzato per il trasporto su ASMX.

Come posso fare lo stesso per una query LINQ? C'è un modo per popolare una query digitata DataSeto DataTabletramite LINQ?

public static MyDataTable CallMySproc()
{
    string conn = "...";

    MyDatabaseDataContext db = new MyDatabaseDataContext(conn);
    MyDataTable dt = new MyDataTable();

    // execute a sproc via LINQ
    var query = from dr
                in db.MySproc().AsEnumerable
                select dr;

    // copy LINQ query resultset into a DataTable -this does not work !    
    dt = query.CopyToDataTable();

    return dt;
}

Come posso ottenere il set di risultati di una query LINQ in un DataSeto DataTable? In alternativa, la query LINQ è serializzabile in modo da poterla esporre come servizio Web ASMX?

Risposte:


87

Come menzionato nella domanda, IEnumerableha un CopyToDataTablemetodo:

IEnumerable<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
    select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable<DataRow>();

Perché non funzionerà per te?


29
Per tutti coloro che si chiedono perché CopyToDataTable () non funziona sul proprio computer: questa funzione non fa parte di .NET 3.5 SP1 né sarà di .NET 4.0; è stato limitato a IEnumerable <DataRows> e non funziona per IEnumerable <T> - bit.ly/dL0G5
motto

26

Per eseguire questa query su una DataContextclasse, devi effettuare le seguenti operazioni:

MyDataContext db = new MyDataContext();
IEnumerable<DataRow> query = 
    (from order in db.Orders.AsEnumerable()
        select new
        {
            order.Property,
            order.Property2
        })
    as IEnumerable<DataRow>;
return query.CopyToDataTable<DataRow>();

Senza il as IEnumerable<DataRow>;simbolo vedrai il seguente errore di compilazione:

Impossibile convertire in modo implicito il tipo "System.Collections.Generic.IEnumerable" in "System.Collections.Generic.IEnumerable". Esiste una conversione esplicita (ti manca un cast?)


22

Crea un set di oggetti di trasferimento dati, un paio di mappatori e restituiscili tramite .asmx.
Non si devono mai esporre direttamente gli oggetti del database, poiché una modifica dello schema della procedura si propaga al consumatore del servizio Web senza che tu lo noti.


15

Se si utilizza un tipo restituito di IEnumerable, è possibile restituire direttamente la variabile di query .



2

Se si utilizza IEnumerablecome tipo restituito, verrà restituita direttamente la variabile della query.

MyDataContext db = new MyDataContext();
IEnumerable<DataRow> query = 
    (from order in db.Orders.AsEnumerable()
        select new
        {
            order.Property,
            order.Property2
        })
    as IEnumerable<DataRow>;
return query.CopyToDataTable<DataRow>();

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.