121


14

LINQクエリ結果セットからDataSetまたはDataTableを埋める

LINQクエリをASMX Webサービスとしてどのように公開しますか? 通常、ビジネス層から、ASMXを介したトランスポート用にシリアル化できる型付きの DataSet`または DataTable`を返すことができます。

LINQクエリでも同じことができますか? LINQクエリを使って型付きの DataSet`や 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クエリの結果セットを DataSet`または DataTable`に入れるにはどうすればいいですか? または、LINQクエリをシリアライズ可能にして、ASMX Webサービスとして公開できるようにしますか。

6 Answer


82


質問で述べたように、 IEnumerable`は CopyToDataTable`メソッドを持ちます。

IEnumerable query =
    from order in orders.AsEnumerable()
    where order.Field("OrderDate") > new DateTime(2001, 8, 1)
    select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable();

それがなぜうまくいかないのでしょうか。


26


このクエリを `DataContext`クラスに対して実行するには、以下のことをする必要があります。

MyDataContext db = new MyDataContext();
IEnumerable query =
    (from order in db.Orders.AsEnumerable()
        select new
        {
            order.Property,
            order.Property2
        })
    as IEnumerable;
return query.CopyToDataTable();

「as IEnumerable;」がないと、次のようなコンパイルエラーが発生します。

_ タイプ「System.Collections.Generic.IEnumerable」を「System.Collections.Generic.IEnumerable」に暗黙的に変換できません。 明示的な変換が存在します(あなたはキャストを見逃していますか?) _


22


一連のデータ転送オブジェクト、いくつかのマッパーを作成し、それを.asmxを介して返します。 プロシージャスキーマの変更は気付かずにWebサービスコンシューマに伝達されるため、データベースオブジェクトを直接公開する必要があります。


16


戻り型の `IEnumerable`を使えば、* query *変数を直接返すことができます。


11


クラスオブジェクトを作成してクエリの `list(T)`を返します。


2


あなたが `IEnumerable`の戻り値の型を使用するなら。それはあなたの問い合わせ変数を直接返すのを助けます。

MyDataContext db = new MyDataContext();
IEnumerable query =
    (from order in db.Orders.AsEnumerable()
        select new
        {
            order.Property,
            order.Property2
        })
    as IEnumerable;
return query.CopyToDataTable();