c# - ejemplos - linq to dataset
Llenar un DataSet o DataTable desde un conjunto de resultados de consulta LINQ (7)
Como se menciona en la pregunta,
IEnumerable
tiene un 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 qué eso no funciona para ti?
¿Cómo expones una consulta LINQ como un servicio web ASMX?
Por lo general, desde el nivel empresarial, puedo devolver un
DataSet
o
DataTable
escrito que se puede serializar para el transporte a través de ASMX.
¿Cómo puedo hacer lo mismo para una consulta LINQ?
¿Hay alguna manera de completar un
DataSet
o
DataTable
escrito 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, ¿es serializable la consulta LINQ para que pueda exponerla como un servicio web ASMX?
Cree un objeto de clase y devuelva una
list(T)
de la consulta.
En aras de la exhaustividad, estas soluciones no funcionan para EF Core (al menos no para EF Core 2.2).
El
IEnumerable<DataRow>
a
IEnumerable<DataRow>
, como se sugiere en las otras respuestas, falla.
La implementación de esta clase y los métodos de extensión funcionaron para mí
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow
.
Por qué no está integrado en EF Core, no tengo idea.
Haga un conjunto de objetos de transferencia de datos, un par de mapeadores y devuélvalos a través de .asmx.
Nunca debe exponer 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 lo note.
Para realizar esta consulta en una clase
DataContext
, deberá 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 un yeso?)
Si usa el tipo de retorno de
IEnumerable
. Ayuda a devolver su 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>();
Si utiliza un tipo de retorno de
IEnumerable
, puede devolver su variable de
consulta
directamente.