Llenar un conjunto de datos o una tabla de datos a partir de un conjunto de resultados de una consulta LINQ

StackOverflow https://stackoverflow.com/questions/16

Pregunta

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

¿Cómo puedo hacer lo mismo para una consulta LINQ?¿Hay alguna manera de completar un escrito? DataSet o DataTable ¿A través de 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 es serializable para poder exponerla como un servicio web ASMX?

¿Fue útil?

Solución

Como se menciona en la pregunta, IEnumerable tiene un CopyToDataTable mé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é eso no funciona para ti?

Otros consejos

Para realizar esta consulta contra un DataContext clase, deberás 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 (¿te falta una conversión?)

Cree un conjunto de objetos de transferencia de datos, un par de mapeadores y devuélvalos a través del archivo .asmx.
Debería nunca exponga 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 se dé cuenta.

Si utiliza un tipo de devolución de IEnumerable, puedes devolver tu consulta variable directamente.

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

Si utiliza el tipo de devolución de IEnumerableAyuda a devolver la variable de consulta directamente.

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>();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top