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

如何将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服务?

0
额外 编辑
意见: 20

5 答案

如果您使用 IEnumerable 的返回类型,则可以直接返回查询变量。

0
额外

如问题所述, IEnumerable 有一个 CopyToDataTable 方法:

IEnumerable query =
    from order in orders.AsEnumerable()
    where order.Field("OrderDate") > new DateTime(2001, 8, 1)
    select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable();

为什么不能为你工作?

0
额外
给每个想知道为什么CopyToDataTable()不能在他们的机器上工作的人:这个函数不是.NET 3.5 SP1的一部分,也不是.NET 4.0的;它仅限于IEnumerable ,不适用于IEnumerable - bit.ly/dL0G5
额外 作者 motto,

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

0
额外

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

0
额外

如果使用 IEnumerable 的返回类型,它有助于直接返回查询变量。

MyDataContext db = new MyDataContext();
IEnumerable query = 
    (from order in db.Orders.AsEnumerable()
        select new
        {
            order.Property,
            order.Property2
        })
    as IEnumerable;
return query.CopyToDataTable();
0
额外