从LINQ查询结果集中填充DataSet或DataTable

如何将LINQ查询作为ASMX Web服务公开? 通常,从业务层,我可以返回一个typesDataSet DataTableDataTable ,可以序列化,通过ASMX传输。

我怎样才能做同样的LINQ查询? 有没有办法通过LINQ查询填充types的DataSetDataTable

 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)