Compilazione di un DataSet o DataTable da un set di risultati di query LINQ
-
08-06-2019 - |
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?
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>();