Pergunta

Como você expor uma consulta LINQ como um serviço web ASMX? Normalmente, a partir da camada de negócios, posso devolver um DataSet digitado ou DataTable que pode ser serializado para o transporte sobre ASMX.

Como posso fazer o mesmo para uma consulta LINQ? Existe uma maneira para preencher um DataSet digitado ou DataTable através 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 serializável consulta LINQ para que eu possa expô-la como um serviço ASMX web?

Foi útil?

Solução

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

Outras dicas

Para executar esta consulta contra uma classe DataContext, 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 tipo 'System.Collections.Generic.IEnumerable' para 'System.Collections.Generic.IEnumerable'. existe uma conversão explícita (faltam um elenco?)

Faça um conjunto de transferência de dados objetos, um par de mapeadores e retorno que via o .asmx.
Você deve não expor o banco de dados de objetos diretamente, como uma mudança no esquema do procedimento irá propagar para o consumidor de serviços web sem você perceber.

Se você usar um tipo de retorno de IEnumerable, você pode retornar a sua query variável diretamente.

Criar um objeto de classe e retornar um list(T) da consulta.

Se você usar o tipo de retorno de IEnumerable.It ajuda a devolver o seu 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