从LINQ查询结果集中填充数据集或数据表


137

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

我如何对LINQ查询执行相同操作?有没有一种方法来填充类型化DataSetDataTable通过LINQ查询?

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服务?

Answers:


87

如问题中所述,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>();

为什么这样对您不起作用?


29
对于每个人都想知道为什么CopyToDataTable()在他们的计算机上不起作用的原因:该函数不是.NET 3.5 SP1的一部分,也不是.NET 4.0的一部分;它仅限于IEnumerable <DataRows>,不适用于IEnumerable <T> – bit.ly/dL0G5
座右铭

26

要针对某个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>;您将看到以下编译错误:

无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.IEnumerable'。存在显式转换(您是否缺少演员表?)


22

制作一组数据传输对象,两个映射器,然后通过.asmx返回。
你应该永远不会直接公开的数据库对象,如过程架构的改变将传播到Web服务消费没有你注意到它。




2

如果IEnumerable用作返回类型,它将直接返回查询变量。

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>();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.