2008-08-01 16 views
106

¿Cómo expone una consulta LINQ como un servicio web ASMX? Por lo general, desde el nivel empresarial, puedo devolver un DataSet o DataTable mecanografiado que se puede serializar para transportarlo a través de ASMX.Rellenar un conjunto de datos o una tabla de datos de un conjunto de resultados de consultas LINQ

¿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?

Respuesta

73

Como se menciona en la pregunta, IEnumerable tiene un método CopyToDataTable:

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>(); 

¿Por qué no que el trabajo para usted?

+28

Para cada uno el preguntarse por qué CopyToDataTable() no funciona en su máquina: esta función no forma parte de .NET 3.5 SP1 ni será de .NET 4.0; se ha restringido a IEnumerable y no funciona para IEnumerable - http://bit.ly/dL0G5 – motto

13

Si utiliza un tipo de devolución de IEnumerable, puede devolver directamente la variable de consulta .

7

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

18

Haz un conjunto de objetos de transferencia de datos, un par de correlacionadores, y devuelve eso a través de .asmx.
Debe nunca 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.

22

Para llevar a cabo esta consulta contra una clase DataContext, tendrá que hacer lo siguiente:

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>(); 

Sin la as IEnumerable<DataRow>; verá el siguiente error de compilación:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)

Cuestiones relacionadas