149

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

如何对 LINQ 查询执行相同的操作?
有没有办法通过 LINQ 查询填充类型DataSet或 a ?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 查询的结果集放入 aDataSet或 a 中DataTable
或者,LINQ 查询是否可以序列化,以便我可以将其公开为 ASMX Web 服务?

4

7 回答 7

92

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

为什么这对你不起作用?

于 2008-08-15T16:27:31.600 回答
28

要对类执行此查询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”。存在显式转换(您是否缺少演员表?)

于 2009-02-13T00:10:02.940 回答
23

制作一组数据传输对象、几个映射器,然后通过 .asmx 将其返回。
永远不应该直接公开数据库对象,因为过程模式中的更改会在您没有注意到的情况下传播到 Web 服务使用者。

于 2008-08-15T16:42:54.097 回答
17

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

于 2008-08-01T14:10:55.757 回答
13

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

于 2008-08-08T12:17:20.750 回答
4

如果您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>();
于 2018-04-11T11:55:31.637 回答
1

为了完整起见,这些解决方案不适用于 EF Core(至少不适用于 EF Core 2.2)。正如此处其他答案中所建议的那样,投射到IEnumerable<DataRow>失败。实现此类和扩展方法对我有用 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow

为什么它没有内置在 EF Core 中,我不知道。

于 2019-06-20T20:14:05.057 回答