Preenchendo um DataSet ou DataTable a partir de um conjunto de resultados de consulta LINQ
-
08-06-2019 - |
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?
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>();