从 LINQ 查询结果集中填充 DataSet 或 DataTable
-
08-06-2019 - |
题
如何将 LINQ 查询公开为 ASMX Web 服务?通常,从业务层,我可以返回一个键入的 DataSet
或者 DataTable
可以序列化以通过 ASMX 进行传输。
如何对 LINQ 查询执行相同的操作?有没有办法填充类型 DataSet
或者 DataTable
通过 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;
}
如何将 LINQ 查询的结果集放入 DataSet
或者 DataTable
?或者,LINQ 查询是否可序列化,以便我可以将其公开为 ASMX Web 服务?
解决方案
正如问题中提到的, 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>();
为什么这对你不起作用?
其他提示
要针对 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”。存在显式转换(您是否缺少强制转换?)
制作一组数据传输对象、几个映射器,并通过 .asmx 返回它们。
你应该 绝不 直接公开数据库对象,因为过程架构中的更改将传播到 Web 服务使用者,而您不会注意到。
如果您使用返回类型 IEnumerable
, ,您可以返回您的 询问 直接变量。
创建一个类对象并返回一个 list(T)
的查询。
如果您使用返回类型 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>();
不隶属于 StackOverflow