从LINQ查询结果集中填充数据集或者数据表
时间:2020-03-05 18:37:13 来源:igfitidea点击:
我们如何将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查询的结果集放入"数据集"或者"数据表"中?另外,LINQ查询是否可以序列化,以便可以将其公开为ASMX Web服务?
解决方案:
如果我们使用的返回类型为" IEnumerable",则可以直接返回查询变量。
创建一个类对象并返回查询的" list(T)"。
正如问题中提到的,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>();
为什么这样对我们不起作用?
制作一组数据传输对象,几个映射器,然后通过.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 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?)