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

voti
109

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

Come posso fare lo stesso per una query LINQ? C'è un modo per popolare un digitato DataSeto DataTabletramite una query 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 una DataSeto DataTable? In alternativa, è il LINQ interrogazione serializeable modo che io possa esporla come un servizio web ASMX?

È pubblicato 01/08/2008 alle 05:59
fonte dall'utente
In altre lingue...                            


6 risposte

voti
76

Come accennato 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 sarà il lavoro per voi?

Risposto il 15/08/2008 a 17:27
fonte dall'utente

voti
24

Per eseguire questa query su una DataContextclasse, è necessario 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 la as IEnumerable<DataRow>;si vedrà il seguente errore di compilazione:

Impossibile convertire implicitamente il tipo 'System.Collections.Generic.IEnumerable' a 'System.Collections.Generic.IEnumerable'. Una conversione esplicita esiste (Vi manca un cast?)

Risposto il 13/02/2009 a 01:10
fonte dall'utente

voti
21

Fare una serie di oggetti di trasferimento dati, un paio di mapper, e restituire che tramite il .asmx.
Si dovrebbe mai esporre gli oggetti di database direttamente, come un cambiamento nello schema procedimento si propagherà al consumatore servizio web senza di te se ne accorga.

Risposto il 15/08/2008 a 17:42
fonte dall'utente

voti
15

Se si utilizza un tipo di ritorno di IEnumerable, è possibile restituire la domanda direttamente variabile.

Risposto il 01/08/2008 a 15:10
fonte dall'utente

voti
10

Creare un oggetto di classe e restituire una list(T)della query.

Risposto il 08/08/2008 a 13:17
fonte dall'utente

voti
3

Se si utilizza il tipo di ritorno di IEnumerable.E aiuta a tornare direttamente la variabile 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>();
Risposto il 11/04/2018 a 11:55
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more