LINQクエリ結果セットからのDataSetまたはDataTableの入力


137

LINQクエリをASMX Webサービスとしてどのように公開しますか?通常、ビジネス層から、型付きを返すDataSetDataTable、ASMXを介して転送するためにシリアル化することができます。

LINQクエリに対して同じことをするにはどうすればよいですか?型付きDataSetまたはDataTableLINQクエリを介してデータを入力する方法はありますか?

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サービスとして公開できますか?

回答:


87

質問で述べたように、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>();

なぜうまくいかないのですか?


29
なぜCopyToDataTable()が自分のマシンで動作しないのか疑問に思う方へ:この関数は.NET 3.5 SP1の一部ではなく、.NET 4.0の一部でもありません。IEnumerable <DataRows>に制限されており、IEnumerable <T>では機能しません-bit.ly/dL0G5
モットー

26

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」に暗黙的に変換することはできません。明示的な変換が存在します(キャストがありませんか?)


22

一連のデータ転送オブジェクトといくつかのマッパーを作成し、.asmxを介してそれを返します。
あなたはすべき決して手続きスキーマの変更は、あなたがそれに気付かずWebサービスコンシューマに伝播するよう、直接データベース・オブジェクトを公開しません。


15

の戻り値の型を使用する場合IEnumerableクエリ変数を直接返すことができます。



2

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>();

0

完全を期すために、これらのソリューションは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に組み込まれていないのか、私にはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.