Vul 'n datastel of datatabel in vanaf 'n LINQ-navraagresultaatstel
-
08-06-2019 - |
Vra
Hoe stel jy 'n LINQ-navraag bloot as 'n ASMX-webdiens?Gewoonlik, vanaf die besigheidsvlak, kan ek 'n getikte terugstuur DataSet
of DataTable
wat geserialiseer kan word vir vervoer oor ASMX.
Hoe kan ek dieselfde doen vir 'n LINQ-navraag?Is daar 'n manier om 'n getikte te vul DataSet
of DataTable
via 'n LINQ-navraag?
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;
}
Hoe kan ek die resultaatstel van 'n LINQ-navraag in 'n DataSet
of DataTable
?Alternatiewelik, is die LINQ-navraag serialiseerbaar sodat ek dit as 'n ASMX-webdiens kan blootstel?
Oplossing
Soos genoem in die vraag, IEnumerable
het 'n CopyToDataTable
metode:
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>();
Hoekom sal dit nie vir jou werk nie?
Ander wenke
Om hierdie navraag uit te voer teen 'n DataContext
klas, sal jy die volgende moet doen:
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>();
Sonder die as IEnumerable<DataRow>;
jy sal die volgende samestellingsfout sien:
Kan nie implisiet tipe 'System.Collections.Generic.IEnumerable' na 'System.Collections.Generic.IEnumerable' omskakel nie.'n Eksplisiete omskakeling bestaan (mis jy 'n rolverdeling?)
Maak 'n stel data-oordragvoorwerpe, 'n paar karteerders, en stuur dit terug via die .asmx.
Jy behoort nooit stel die databasisobjekte direk bloot, aangesien 'n verandering in die prosedureskema na die webdiensverbruiker sal voortplant sonder dat jy dit agterkom.
As jy 'n terugkeer tipe gebruik van IEnumerable
, kan jy jou terugbesorg navraag veranderlik direk.
Skep 'n klasobjek en gee terug a list(T)
van die navraag.
As jy die terugkeer tipe gebruik van IEnumerable
.Dit help om jou navraagveranderlike direk terug te gee.
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>();