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

votos
109

¿Cómo expone una consulta LINQ como un servicio web ASMX? Por lo general, desde el nivel empresarial, puedo devolver un tipeo DataSeto DataTableque se puede serializar para el transporte a través de ASMX.

¿Cómo puedo hacer lo mismo con una consulta LINQ? ¿Hay alguna forma de rellenar una solicitud escrita DataSeto DataTablemediante 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 DataSeto DataTable? Alternativamente, ¿la consulta LINQ se puede serializar para que pueda exponerla como un servicio web ASMX?

Publicado el 01/08/2008 a las 05:59
fuente por usuario
En otros idiomas...                            


7 respuestas

votos
15

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

Respondida el 01/08/2008 a las 15:10
fuente por usuario

votos
10

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

Respondida el 08/08/2008 a las 13:17
fuente por usuario

votos
76

Como se menciona en la pregunta, IEnumerabletiene un CopyToDataTablemétodo:

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 va a funcionar para ti?

Respondida el 15/08/2008 a las 17:27
fuente por usuario

votos
21

Cree un conjunto de Objetos de transferencia de datos, un par de correlacionadores, y devuélvalo a través de .asmx.
Usted debe nunca se exponen los objetos de base de datos directamente, como un cambio en el esquema de procedimiento se propagará al consumidor de servicios web sin que se dé cuenta.

Respondida el 15/08/2008 a las 17:42
fuente por usuario

votos
24

Para realizar esta consulta en una DataContextclase, deberá 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 el as IEnumerable<DataRow>;verá el siguiente error de compilació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?)

Respondida el 13/02/2009 a las 01:10
fuente por usuario

votos
3

Si se utiliza el tipo de retorno de IEnumerable.Es ayuda a devolver directamente la variable de consulta.

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>();
Respondida el 11/04/2018 a las 08:55
fuente por usuario

votos
0

En aras de la exhaustividad, estas soluciones no funcionan para EF Core (al menos no para EF Core 2.2). La conversión a IEnumerable<DataRow>, como se sugiere en las otras respuestas aquí, falla. La implementación de esta clase y métodos de extensión trabajado para mí https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow .

¿Por qué no se construye en EF Core, no tengo idea.

Respondida el 20/06/2019 a las 23:14
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more