如何将LINQ查询公开为ASMX Web服务?通常,从业务层,我可以返回一个类型化的DataSet
或DataTable
,可以序列化以通过ASMX进行传输。
如何为LINQ查询执行相同的操作?有没有办法通过LINQ查询填充键入的DataSet
或DataTable
?
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;
}
如何将LINQ查询的结果集合成DataSet
或DataTable
?或者,LINQ查询是否可序列化,以便我可以将其作为ASMX Web服务公开?
答案 0 :(得分:82)
正如问题所述,IEnumerable
有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>();
为什么这不适合你?
答案 1 :(得分:26)
要对DataContext
课程执行此查询,您需要执行以下操作:
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>();
如果没有as IEnumerable<DataRow>;
,您将看到以下编译错误:
无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.IEnumerable'。存在显式转换(您是否错过了演员?)
答案 2 :(得分:22)
创建一组数据传输对象,几个映射器,并通过.asmx返回。
您应该永远直接公开数据库对象,因为过程模式中的更改将传播给Web服务使用者而不会注意到它。
答案 3 :(得分:15)
如果您使用IEnumerable
的返回类型,则可以直接返回查询变量。
答案 4 :(得分:11)
创建一个类对象并返回查询的list(T)
。
答案 5 :(得分:2)
如果使用返回类型IEnumerable
。它有助于直接返回查询变量。
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>();
答案 6 :(得分:0)
出于完整性考虑,这些解决方案不适用于EF Core(至少不适用于EF Core 2.2)。如此处其他答案所示,转换为IEnumerable<DataRow>
失败。实施此类和扩展方法对我https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow有效。
我为什么不知道为什么它没有内置在EF Core中?