从LINQ查询结果集中填充DataSet或DataTable
问题描述:
如何将LINQ查询作为ASMX Web服务公开?通常,从业务层,我可以返回一个输入的DataSet
或DataTable
,可以序列化以便通过ASMX传输。从LINQ查询结果集中填充DataSet或DataTable
我该如何为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服务?
答
正如在问题中提到,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>();
为什么不会为你工作?
答
如果您使用的IEnumerable
返回类型,你可以直接返回您查询变量。
答
创建一个类对象并返回查询的list(T)
。
答
制作一组数据传输对象,一对映射器,并通过.asmx返回。
您应该从不直接暴露数据库对象,因为过程模式中的更改将传播到Web服务使用者而不会发现它。
答
要执行针对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>;
,你会看到下面的编译错误:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)
为了大家想知道为什么CopyToDataTable()在他们的机器上不起作用:这个函数不是.NET 3.5 SP1的一部分,也不是.NET 4.0的;它已被限制为IEnumerable,并且不适用于IEnumerable - http://bit.ly/dL0G5 –
motto
2010-02-02 22:00:11