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

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

Come posso fare lo stesso per una query LINQ? C’è un modo per popolare un DataSet o DataTable tipizzato 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 DataSet o DataTable ? In alternativa, la query LINQ è serializzabile in modo che possa esporlo come servizio Web ASMX?

Come menzionato nella domanda, IEnumerable ha un metodo CopyToDataTable :

 IEnumerable query = from order in orders.AsEnumerable() where order.Field("OrderDate") > new DateTime(2001, 8, 1) select order; // Create a table from the query. DataTable boundTable = query.CopyToDataTable(); 

Perché non funzionerà per te?

Per eseguire questa query su una class DataContext , è necessario effettuare quanto segue:

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

Senza il as IEnumerable; vedrai il seguente errore di compilazione:

Imansible convertire implicitamente il tipo “System.Collections.Generic.IEnumerable” in “System.Collections.Generic.IEnumerable”. Esiste una conversione esplicita (ti manca un cast?)

Crea una serie di oggetti Data Transfer, un paio di mapper e restituiscili tramite .asmx.
Non dovresti mai esporre direttamente gli oggetti del database, poiché una modifica dello schema della procedura si propagherà al consumatore del servizio web senza che tu te ne accorga.

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

Creare un object di class e restituire una list(T) della query.

Se si utilizza il tipo restituito di IEnumerable . IEnumerable restituire direttamente la variabile di query.

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