前提
DataBaseから取得したデータをDataTableに格納しています。
SQLで取得したデータが入っています。
各カラムの型は
ID:int
Name:string
Age:int
Option:string
となります。
開発環境
Windows10
VisualStudio Community 2019 Version 16.8.5
.NET Framework 4.7.2
Oracle 11g
実現したいこと
データが格納されているDataTableから条件を指定して
必要なカラムだけを残したDataTableをLinqのSelectを使って取得したい。
SQLのようにselect id, name from dataみたいに完結に書けないでしょうか。
ソースコード
データ取得方法
c#
1using (OracleCommand command = new OracleCommand(sql, conn)) { 2 using (OracleDataAdapter dataAdapter = new OracleDataAdapter(command)) { 3 DataSet dataSet = new DataSet(); 4 dataAdapter.Fill(dataSet); 5 DataTable dataTable = dataSet.Tables[0].Copy(); 6 return dataTable; 7 } 8}
カラムに ID, Name, Age, Option があるとします。
条件:Option = '1'
欲しい列:ID, Name
※ [DataBase]~のデータ取得クラスは仮想です
※ Selectの書き方のようなイメージです(実際にはエラーになります)
c#
1DataTable data = [DataBase].GetData(sql); // 2DataTable result = data.AsEnumerable() 3 .Where(x => x["Option"] == '1') 4 .Select(x => new {id = x["ID"].ToString(), 5 name = x["Name"].ToString()});
開発環境を書きましょう。(OS, Visual Studio のバージョン, .NET Framework or Core どっちなのかとそのバージョンなど, DB は何かとそのエディション・バージョンなど)
> DataTableのカラムは型指定などせずにSQLで取得したデータがそのまま入っています。
元の DB のテーブルの各列の型は何か、どのように DataTable に取得したのか書いてください。DataAdapter.Fill メソッドで取得すると DataTable の列は自動的に型付けられるはずです。型が不明なのでは答えは出ません。
DB に直接 SELECT ID, Name FROM Table WHERE Option = '1' というクエリを投げて結果を DataTable に取得すれば済むはずなのですが、何故それをしないのですか?
バージョンも型もエラーメッセージもわからずどうしろと言う感じですが、
x["Option"] == '1'
↓
x["Option"] is 1
x["Option"] is '1'
x["Option"] is "1"
ご指摘ありがとうございます。
開発環境
Windows10
VisualStudio Community 2019 Version 16.8.5
.NET Framework 4.7.2
Oracle 11g
以下のように取得しています。
using (OracleCommand command = new OracleCommand(sql, conn)) {
    using (OracleDataAdapter dataAdapter = new OracleDataAdapter(command)) {
        DataSet dataSet = new DataSet();
        dataAdapter.Fill(dataSet);
        DataTable dataTable = dataSet.Tables[0].Copy();
        return dataTable;
    }
}
>SurferOnWww 様
マスタデータですので都度DBへのアクセスを減らしたいのが目的です。
>Zuishin 様
開発環境について記載せず申し訳ございませんでした。
ぶっちゃけると列数を変えたDataTableをLinqだけで返すのは無理です。
LinqでDataTableを返すためにはIEnumerable<DataRow>が必要であり、列を変えたDataRowをnewすることはできない。(やろうと思えば別だがリスクと労力に合わない)
>neconekocat 様
そういうものなんですね。LinqとSQLは違うものとは思っているんですが
やり方がわからないだけで似たような書き方ができるのかと思って質問させていただきました。
ご回答ありがとうございます。
あくまで列を変えるのができないだけで行を絞り込んだDataTableは作れます。手動でRemoveするのが現実的かと。
dataAdapter.Fill(dataSet); で取得したなら、各列には DB の各フィールドに応じた型が自動的に付けられているはずです。それを書いてください。型が分からないのでは何ともなりません。
>neconekocat 様
現実的ということ承知しました。
ありがとうございます。
>SurferOnWww 様
IDはint、Nameはstringとなります。
Option は何ですか? SQL 文で言うところの WHERE 句の条件にしたいのですよね?
はい、型はstringになります。
上の DataTable 型情報は質問欄を編集して追加情報として追記願います。コメント欄は初期画面では開いてないので、読まない人がいますから。
回答1件
あなたの回答
tips
プレビュー