关于C#:从LINQ查询结果集中填充数据集或数据表

关于C#:从LINQ查询结果集中填充数据集或数据表

Filling a DataSet or DataTable from a LINQ query result set

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

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

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查询的结果集放入DataSetDataTable? 另外,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中。


推荐阅读