Bagaimana Anda mengekspos kueri LINQ sebagai layanan web ASMX? Biasanya, dari tingkat bisnis, saya dapat mengembalikan yang diketik DataSet
atau DataTable
yang dapat diserialkan untuk diangkut melalui ASMX.
Bagaimana saya bisa melakukan hal yang sama untuk kueri LINQ? Apakah ada cara untuk mengisi kueri yang diketik DataSet
atau DataTable
melalui 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;
}
Bagaimana saya bisa mendapatkan hasil dari query LINQ menjadi DataSet
atau DataTable
? Atau, apakah kueri LINQ dapat diserialkan sehingga saya dapat memaparkannya sebagai layanan web ASMX?
c#
linq
web-services
.net-3.5
Geoff Dalgas
sumber
sumber
Untuk melakukan kueri ini terhadap sebuah
DataContext
kelas, Anda perlu melakukan hal berikut: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>();
Tanpa
as IEnumerable<DataRow>;
Anda akan melihat kesalahan kompilasi berikut:sumber
Buat satu set Objek Transfer Data, beberapa pembuat peta, dan kembalikan melalui .asmx.
Anda tidak boleh mengekspos objek database secara langsung, karena perubahan dalam skema prosedur akan menyebar ke konsumen layanan web tanpa Anda sadari.
sumber
Jika Anda menggunakan tipe kembalian
IEnumerable
, Anda bisa mengembalikan variabel kueri Anda secara langsung.sumber
Buat objek kelas dan kembalikan
list(T)
kueri.sumber
Jika Anda menggunakan
IEnumerable
sebagai tipe pengembalian, itu akan mengembalikan variabel kueri Anda secara langsung.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>();
sumber
Demi kelengkapan, solusi ini tidak berfungsi untuk EF Core (setidaknya tidak untuk EF Core 2.2). Transmisi ke
IEnumerable<DataRow>
, seperti yang disarankan dalam jawaban lain di sini, gagal. Menerapkan metode kelas dan ekstensi ini berhasil untuk saya https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow .Mengapa tidak disertakan dalam EF Core, saya tidak tahu.
sumber