Preenchendo um DataSet ou DataTable a partir de um conjunto de resultados de consulta LINQ

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

Pergunta

Como você expõe uma consulta LINQ como um serviço web ASMX?Normalmente, na camada comercial, posso retornar um texto digitado DataSet ou DataTable que pode ser serializado para transporte por ASMX.

Como posso fazer o mesmo para uma consulta LINQ?Existe uma maneira de preencher um digitado DataSet ou DataTable por meio de uma 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;
}

Como posso obter o conjunto de resultados de uma consulta LINQ em um DataSet ou DataTable?Alternativamente, a consulta LINQ é serializável para que eu possa expô-la como um serviço web ASMX?

Foi útil?

Solução

Como mencionado na pergunta, IEnumerable tem um 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 que isso não funciona para você?

Outras dicas

Para realizar esta consulta em um DataContext classe, você precisará fazer o seguinte:

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

Sem o as IEnumerable<DataRow>; você verá o seguinte erro de compilação:

Não é possível converter implicitamente o tipo 'System.Collections.Generic.IEnumerable' em 'System.Collections.Generic.IEnumerable'.Existe uma conversão explícita (está faltando uma conversão?)

Faça um conjunto de objetos de transferência de dados, alguns mapeadores e retorne-os por meio do .asmx.
Você deve nunca exponha os objetos do banco de dados diretamente, pois uma alteração no esquema do procedimento será propagada para o consumidor do serviço da Web sem que você perceba.

Se você usar um tipo de retorno de IEnumerable, você pode devolver seu consulta variável diretamente.

Crie um objeto de classe e retorne um list(T) da consulta.

Se você usar o tipo de retorno de IEnumerable.Isso ajuda a retornar sua variável de consulta diretamente.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top