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

funde 发布于 2018-02-02 c# 最后更新 2018-02-02 11:30 498 浏览

如何将LINQ查询作为ASMX Web服务公开?通常,从业务层,我可以返回一个类型化的DataSetDataTable,它可以被序列化以通过ASMX传输。 我怎样才能做同样的LINQ查询?有没有办法通过LINQ查询来填充类型化的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查询的结果集到DataSetDataTable?或者,LINQ查询是否可序列化以便我可以将其作为ASMX Web服务公开?
已邀请:

hvelit

赞同来自:

如果使用返回类型IEnumerable,则可以直接返回query变量。

svero

赞同来自:

创建一个类对象并返回查询的list(T)

vvel

赞同来自:

正如问题所述,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>();
为什么不能为你工作?

ueaque

赞同来自:

制作一组数据传输对象,几个映射器,然后通过.asmx返回 您应该never直接公开数据库对象,因为过程模式中的更改将传播到Web服务使用者,而不会发现它。

funde

赞同来自:

要对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?)