Rellenar un DataSet o DataTable de un conjunto de resultados de consulta LINQ

¿Cómo expone una consulta LINQ como un servicio web ASMX? Por lo general, desde el nivel empresarial, puedo devolver un DataSet o DataTable typescripts que se pueden serializar para su transporte a través de ASMX.

¿Cómo puedo hacer lo mismo con una consulta LINQ? ¿Hay alguna forma de rellenar un DataSet o DataTable con una consulta 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; } 

¿Cómo puedo obtener el conjunto de resultados de una consulta LINQ en un DataSet o DataTable ? Alternativamente, ¿la consulta LINQ se puede serializar para que pueda exponerla como un servicio web ASMX?

Como se menciona en la pregunta, IEnumerable tiene un método 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(); 

¿Por qué no va a funcionar para ti?

Para realizar esta consulta en una clase DataContext , deberá hacer lo siguiente:

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

Sin el as IEnumerable; Verás el siguiente error de comstackción:

No se puede convertir implícitamente el tipo ‘System.Collections.Generic.IEnumerable’ a ‘System.Collections.Generic.IEnumerable’. Existe una conversión explícita (¿falta un elenco?)

Cree un conjunto de Objetos de transferencia de datos, un par de correlacionadores, y devuélvalo a través de .asmx.
Nunca debe exponer los objetos de la base de datos directamente, ya que un cambio en el esquema del procedimiento se propagará al consumidor del servicio web sin que usted lo note.

Si usa un tipo de IEnumerable de IEnumerable , puede devolver su variable de consulta directamente.

Crea un objeto de clase y devuelve una list(T) de la consulta.

Si usa el tipo de retorno de IEnumerable . Ayuda a devolver su variable de consulta directamente.

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