从 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 服务公开?

87278 次浏览

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

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

正如问题中提到的,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>();

为什么不行呢?

创建一组数据传输对象和几个映射器,并通过. asmx 返回它们。
您应该直接公开数据库对象,因为过程模式中的更改将传播到 Web 服务使用者而不会引起您的注意。

要对 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.IEnumable”转换为“ System.Collections.Generic.IEnumable”。存在显式转换(是否缺少强制转换?)

如果使用 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>();

为了完整起见,这些解决方案不适用于 EF Core (至少不适用于 EF Core 2.2)。正如这里的其他答案所建议的那样,向 IEnumerable<DataRow>的转换失败了。实现这个类和扩展方法对我来说很有用。

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