Domanda

Come si espone una query LINQ come servizio Web ASMX?Di solito, dal livello business, posso restituire un file typed DataSet O DataTable che può essere serializzato per il trasporto su ASMX.

Come posso fare lo stesso per una query LINQ?C'è un modo per popolare un typed DataSet O DataTable tramite 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 un file DataSet O DataTable?In alternativa, la query LINQ è serializzabile in modo da poterla esporre come servizio Web ASMX?

È stato utile?

Soluzione

Come accennato nella domanda, IEnumerable ha un CopyToDataTable metodo:

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?

Altri suggerimenti

Per eseguire questa query su a DataContext lezione, dovrai 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>; 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?)

Crea un set di oggetti di trasferimento dati, un paio di mappatori e restituiscili tramite .asmx.
Dovresti Mai esporre direttamente gli oggetti del database, poiché una modifica nello schema della procedura si propagherà al consumatore del servizio Web senza che tu te ne accorga.

Se utilizzi un tipo di ritorno di IEnumerable, puoi restituire il tuo domanda variabile direttamente.

Crea un oggetto di classe e restituisce a list(T) della domanda.

Se utilizzi il tipo di ritorno di IEnumerable.Aiuta a restituire direttamente la variabile di 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>();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top