Preenchendo um DataSet ou DataTable de um conjunto LINQ resultado da consulta

votos
109

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

Como posso fazer o mesmo para uma consulta LINQ? Existe uma maneira para preencher um digitado DataSetou DataTableatravé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 DataSetou DataTable? Alternativamente, é a serializeable consulta LINQ para que eu possa expô-la como um serviço web ASMX?

Publicado 01/08/2008 em 05:59
fonte usuário
Em outras línguas...                            


6 respostas

votos
76

Como mencionado em questão, IEnumerabletem um 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 que não vai trabalhar para você?

Respondeu 15/08/2008 em 17:27
fonte usuário

votos
24

Para executar esta consulta contra uma DataContextclasse, você precisa 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>;que você verá o seguinte erro de compilação:

Não é possível converter implicitamente tipo 'System.Collections.Generic.IEnumerable' para 'System.Collections.Generic.IEnumerable'. Uma conversão explícita existe (faltam um elenco?)

Respondeu 13/02/2009 em 01:10
fonte usuário

votos
21

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

Respondeu 15/08/2008 em 17:42
fonte usuário

votos
15

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

Respondeu 01/08/2008 em 15:10
fonte usuário

votos
10

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

Respondeu 08/08/2008 em 13:17
fonte usuário

votos
3

Se você usar o tipo de retorno de IEnumerable.Ele 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>();
Respondeu 11/04/2018 em 11:55
fonte usuário

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