如何将 LINQ 查询公开为 ASMX Web 服务?通常,从业务层,我可以返回一个键入的 DataSet 或者 DataTable 可以序列化以通过 ASMX 进行传输。

如何对 LINQ 查询执行相同的操作?有没有办法填充类型 DataSet 或者 DataTable 通过 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 查询的结果集放入 DataSet 或者 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>; 你会看到以下编译错误:

无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(您是否缺少强制转换?)

制作一组数据传输对象、几个映射器,并通过 .asmx 返回它们。
你应该 绝不 直接公开数据库对象,因为过程架构中的更改将传播到 Web 服务使用者,而您不会注意到。

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

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

如果您使用返回类型 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>();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top