Cum te expune o interogare LINQ ca un ASMX web service? De obicei, la nivel de afaceri, pot reveni cu un scris de Date " sau " DataTable
care poate fi serializat pentru transportul pe ASMX.
Cum pot face același lucru pentru o interogare LINQ? Există o modalitate de a popula un scris de Date " sau " DataTable
printr-o interogare 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;
}
Cum pot obține setul de rezultate de interogare LINQ într-un set de Date " sau " DataTable`? Alternativ, este de interogare LINQ serializable, astfel încât să pot expune ca un ASMX web service?
După cum sa menționat în întrebare, pentru IEnumerableare o
CopyToDataTable` metoda:
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>();
De ce nu't care lucrează pentru tine?
Pentru a efectua această interogare împotriva unui `DataContext clasa, ai'll nevoie pentru a face următoarele:
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>();
Fără ca IEnumerable
nu Poate converti implicit de tip 'System.Colecții.Generic.IEnumerable<AnonymousType#1>' sa 'System.Colecții.Generic.IEnumerable<System.Date.DataRow>'. O conversie explicită există (vă lipsește o distributie?)
Face un set de Obiecte de Transfer de Date, o pereche de cartografi, și să se întoarcă că prin intermediul .asmx. Tu ar trebui să nu expune obiectele bazei de date în mod direct, ca o schimbare în procedura schemă va propaga pe web servicii de consum fără să-l observe.
A crea un obiect de clasă și să se întoarcă o lista(T)` de interogare.
Dacă utilizați tipul de returnare a IEnumerable
.Ajută reveni interogare variabila direct.
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>();
Pentru motive de exhaustivitate, aceste soluții nu funcționează pentru EF de Bază (cel puțin nu pentru EF Core 2.2). De turnare a IEnumerable<DataRow>
, după cum a sugerat în alte raspunsuri aici, nu reușește. De punere în aplicare această clasă și metode de extensie a lucrat pentru mine https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow.
De ce-l's construit în EF Core, nu am idee.