Bagaimana anda mengekspos LINQ query sebagai ASMX web service? Biasanya, dari bisnis tier, aku bisa kembali mengetik DataSet
atau DataTable
yang dapat serial untuk mengangkut lebih dari ASMX.
Bagaimana saya bisa melakukan hal yang sama untuk LINQ query? Apakah ada cara untuk mengisi diketik DataSet
atau DataTable
melalui LINQ query?
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 yang ditetapkan dari LINQ query ke DataSet
atau DataTable
? Atau, apakah LINQ query serializable sehingga saya dapat mengekspos sebagai ASMX web service?
Seperti yang disebutkan dalam pertanyaan, IEnumerable
memiliki 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>();
Mengapa tidak't yang bekerja untuk anda?
Untuk melakukan query terhadap sebuah DataContext
kelas, anda'll 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 sebagai IEnumerable<DataRow>;
anda akan melihat berikut kompilasi error:
Tidak secara implisit mengkonversi tipe 'System.Koleksi.Generic.IEnumerable<AnonymousType#1>' untuk 'System.Koleksi.Generic.IEnumerable<System.Data.DataRow>'. Konversi eksplisit ada (anda hilang cor?)
Membuat satu set Data Transfer Benda, beberapa pembuat peta, dan kembali melalui .asmx. Anda harus: tidak pernah mengekspos objek database secara langsung, sebagai perubahan dalam prosedur skema akan merambat ke web layanan konsumen tanpa anda menyadarinya.
Membuat sebuah kelas objek dan kembali daftar(T)
query.
Jika anda menggunakan jenis kembali dari IEnumerable
.Hal ini membantu mengembalikan query variabel ini diatas.
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>();
Demi kelengkapan, solusi ini tidak bekerja untuk EF Inti (setidaknya tidak untuk EF Core 2.2). Casting untuk IEnumerable<DataRow>
, seperti yang disarankan dalam jawaban yang lain di sini, gagal. Melaksanakan kelas ini dan metode ekstensi bekerja untuk saya https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow.
Mengapa itu's tidak dibangun ke EF Inti, saya tidak tahu.