none
メモリー上のデータテーブルからのレコード抽出について RRS feed

  • 質問

  • 皆様、こんにちわ!
    いつもお世話になります。

    メモリー上に作成したデータテーブルから、条件に合致するレコードを抽出
    する方法についてお尋ねします。

    SQL Server にあるDB上のテーブルからは、下記の様な感じで条件に合致する
    レコードを抽出して dataGridView に表示しています。

    var query = from ele in テーブル
                where ele.カラム == "test"
                select ele;
               
    dataGridView.DataSource = query;


    同じような方法で、メモリー上にあるデータテーブルから条件に合致した
    レコードを抽出しようと思い色々調べながらトライしたのですが具体的な
    方法が分からず問題解決に至りません。


    そこで、次のような方法を見つけて試みました。

    DataView dvTable = testTable.DefaultView;
    dvTable.RowFilter = "カラム名 = 'test'";
    dataGridView.DataSource = dvTable;

    これで 何とか目的は果たせるようになったのですが、次の問題が出てきました。

    抽出条件 'test' の部分を定数ではなく文字列変数にしたいのですが、その
    方法が分かりません。

    何れかの方法で目的を果たしたいのですが、アドバイス・ヒントなどを
    教えて頂けませんでしょうか。

    どうか宜しくお願い致します。

    2010年12月17日 2:06

回答

すべての返信

  • 下記のように、string.Format を使えばいいのでは?

    string value = "test";
    dvTable.RowFilter = string.Format("カラム名 = '{0}'", value);
    

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年12月17日 2:21
  • DataTableでも、

    var query = from ele in testTable
                where ele.カラム == "test"
                select ele;

    と殆ど同じように LINQ で書けますよ。

    2010年12月17日 2:34
  • なかむら 様、早速有り難うございます。

    string.Format("カラム名 = '{0}'", value); みたいな書き方をあちこちで見かけるんですが、
    これまで必要に迫られた事が無かったので、書き方の詳細を理解しないまま過ごしていました。

    改めて詳細を確認しながら、教えて頂いた方法で試してみます。

    結果は、改めて・・・

    2010年12月17日 3:03
  • T-Yokoo 様、早速有り難うございます。

    これまでやってみた所、

    var query = from ele in testTable

    の 『testTable』 の所で、何だったかエラーになっていたように思ったんですが、もう一度
    試してみます。

    結果は、改めて・・・

    2010年12月17日 3:03
  • var query = from ele in testTable.AsEnumerable()

    とすれば大丈夫だと思いますよ。Linq to Objectです。

     #(訂正)LINQ to DataSetの間違いかな(しかもLINQ to Objectsだし)。DLINQがLINQ to SQLに変わったのとごっちゃになったようです。すみません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年12月17日 3:12
    モデレータ
  • > var query = from ele in testTable.AsEnumerable()
    > とすれば大丈夫だと思いますよ。Linq to Objectです。

    古いコレクションやデータセットは IEnumerable<T> を実装していないので、ダメなんですよね。

    型付き DataSet1 の Table1 であれば

    var query = from row in testTable.Rows.Cast<DataSet1.DataSet1Table1>()

    型無しであれば

    var query = from row in testTable.Rows.Cast<DataRow>()

    あたりですかね? あとは、Visual Studio 2008 以降で XSD を使用した場合、TypedDataTable なんかを使用してくれるので、一番最初に提示された

    var query = from ele in testTable

    と書けるようになります。(TypedDataTable は IEnumerable<Row型> を実装するので)

    2010年12月17日 4:07
  • なかむら 様、有り難うございました。

    まずは教えて頂いた方法でフィルターをかけての抽出動作を確認できました。

    その後、dvTable.RowFilter = "カラム名 = 'test'" そのものの扱い方で疑問が
    生じてきましたが、こちらに付いては もう少し状況を詳しく把握した後で、
    改めて別のスレッドにて質問させて頂こうと思っています。

    どうも、有難うございました。
    これからも、どうぞ宜しくお願いします。

    2010年12月17日 16:17
  • trapemiya 様、K. Takaoka 様、有難うございます。

    > var query = from ele in testTable.AsEnumerable()
    > とすれば大丈夫だと思いますよ。Linq to Objectです。

    については、詳しい意味は分かりませんが、K. Takaoka 様が仰るように
    ダメみたいですネ。

    で、 var query = from row in testTable.Rows.Cast<DataSet1.DataSet1Table1>()
        var query = from row in testTable.Rows.Cast<DataRow>()

    に付いてですが、色々調べながらやってみたのですが、どうも知識が不十分で
    まだ結果がでず、もう少しトライしてみます。

    あと、当方の環境は、Visual Studio 2008 Express orVisual Studio 2010 なので
    『XSD を使用した場合・・・』が理解できれば最も望ましいと思い TypedDataTableや
    XSDがどんなものかと調べてみましたが、英文の記事が多くなかなか手強そうです。

    簡単な実例を添えた参考になる資料など教えて頂ければ有り難いのですが、
    この辺りは、オーソドックスなドキュメントになるのでしょうか。

    教えて頂いた事柄を元に、もう少し頑張ってみます。

    どうも、有難うございました。
    また、よろしくお願いします。

    2010年12月17日 16:37
  • については、詳しい意味は分かりませんが、K. Takaoka 様が仰るように
    ダメみたいですネ。


    参照設定でSystem.Data.DataSetExtensionsを追加されていますか? かつ、名前空間としてSystem.Dataを指定しなければなりません。AsEnumerable拡張メソッドは、.NET Framework 3.5で追加されました。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年12月17日 17:33
    モデレータ
  • trapemiya さま、こんにちは!

    大分時間が過ぎてしまいましたが、当初の問題については、別の手立てを使い
    シコシコ記述する事で解決しました。

    しかし、ここで教えて頂いた事を是非とも習得したいので確認をさせてください。

    > 参照設定でSystem.Data.DataSetExtensionsを追加

    とは、『参照の追加』から、タブ .NETにある『System.Data.DataSetExtensions』を
    追加し、

    > 名前空間としてSystem.Dataを指定

    とは、using System.Data; を記述する事ですね。


    その後、色々調べながらやってみたのですが、どうもしっくり行きません。

    そもそも、この辺りの知識が不十分で、K. Takaoka さまが教えてくださっている
    事柄との関係も理解し切れていません。
    先の2点で間違いがなければ、もう少し基本的な事を勉強してみたいと思います。
    その上で、何が分からないのかハッキリさせ、改めて教えを請う事にします。

    そんな事で、このスレッドは一旦クローズさせて頂きます。

    皆さん、どうも有難うございました。

    2010年12月30日 4:30
  • 確認に関してはその通りです。

    以下などのでLINQ To DataSetを使用できるようにする方法を確認してみて下さい。

    方法 : Visual Studio で LINQ to DataSet プロジェクトを作成する
    http://msdn.microsoft.com/ja-jp/library/bb552414.aspx

    方法 : LINQ プロジェクトを作成する
    http://msdn.microsoft.com/ja-jp/library/bb546156(VS.90).aspx

    端的に言えば、System.Data.DataSetExtensions.dll内にDataTableなどの拡張メソッドが含まれており、System.Data.DataSetExtensions.dllを追加することによって、DataTableなどのクラスに一切変更を加えることなく、DataTableなどにLinq関連のメソッドが追加されます。

    また、LINQ to DataSetのプログラミングに関しては以下を参照されると良いと思います。

    LINQ to DataSet
    http://msdn.microsoft.com/ja-jp/library/bb386977.aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年12月30日 7:32
    モデレータ
  • trapemiya さん、こんにちは!

    色々と参照先をご紹介くださり、ありがとうございます。

    それぞれ確認しながら、一歩ずつ理解を深めたいと思います。

    今後とも、どうぞ宜しくお願いいたします。

    このスレッドは、これで一旦クローズさせて頂きます。
    みなさん、ありがとうございました。

    2010年12月31日 5:59