您如何将LINQ查询公开为ASMX Web服务? 通常,从业务层,我可以返回类型化的DataSet或DataTable,可以对其进行序列化以通过ASMX进行传输。
我如何对LINQ查询执行相同操作? 有没有办法通过LINQ查询填充类型化的DataSet或DataTable?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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方法:
1 2 3 4 5 6 7
| 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类执行此查询,您需要执行以下操作:
1 2 3 4 5 6 7 8 9 10
| 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;,您将看到以下编译错误:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)
制作一组数据传输对象,几个映射器,然后通过.asmx返回。
永远不要直接公开数据库对象,因为过程模式中的更改会在不引起注意的情况下传播到Web服务使用者。
如果使用返回类型IEnumerable,则可以直接返回查询变量。
创建一个类对象并返回查询的list(T)。
如果使用返回类型IEnumerable,则有助于直接返回查询变量。
1 2 3 4 5 6 7 8 9 10
| 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失败。实施此类和扩展方法对我有用https://docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow。
我不知道为什么它没有内置在EF Core中。