从LINQ查询结果集中填充DataSet或DataTable
如何将LINQ查询作为ASMX Web服务公开? 通常,从业务层,我可以返回一个typesDataSet
DataTable
或DataTable
,可以序列化,通过ASMX传输。
我怎样才能做同样的LINQ查询? 有没有办法通过LINQ查询填充types的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查询的结果集到DataTable
集或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>;
你会看到下面的编译错误:
不能隐式地将types“System.Collections.Generic.IEnumerable”转换为“System.Collections.Generic.IEnumerable”。 存在明确的转换(您是否缺less演员?)
制作一组数据传输对象,一些映射器,然后通过.asmx返回。
您不应直接公开数据库对象,因为过程模式中的更改将传播到Web服务使用者,而不会发现它。
如果使用IEnumerable
的返回types,则可以直接返回查询variables。
创build一个类对象并返回查询的list(T)
。