2019/02/25(Mon) 10:47:51 編集(投稿者)
魔界の仮面弁士 さん
LINQのラムダ式を動的に指定する方法がどうしてもわからず、、、
質問させていただいてもよろしいでしょうか。。
以下のように、条件テーブル:dtConditionと、チェック対象テーブル:dtMainがあったとして、
LINQのGroupBy拡張メソッドへ動的に値を指定したいのですが、
そのやり方が不明で、、どうしてもべた書きにせざるを得ないんです。
何か方法があるものなのでしょうか。
■サンプルソース
---------------------------------------------------------------------------------
using System.Linq;
using System.Data;
namespace ConsoleApp25 {
class Program {
static void Main(string[] args) {
// ■条件テーブル
DataTable dtCondition = new DataTable();
dtCondition.Columns.Add("SEQ", typeof(int)).AllowDBNull = true;
dtCondition.Columns.Add("Condition", typeof(string)).AllowDBNull = true;
DataRow dr = dtCondition.NewRow();
dr["SEQ"] = 1;
dr["Condition"] = "KAWAUSO_COL01";
dtCondition.Rows.Add(dr);
dr = dtCondition.NewRow();
dr["SEQ"] = 2;
dr["Condition"] = "KAWAUSO_COL02";
dtCondition.Rows.Add(dr);
dr = dtCondition.NewRow();
dr["SEQ"] = 3;
dr["Condition"] = "KAWAUSO_COL03";
dtCondition.Rows.Add(dr);
// ■チェック対象テーブル
DataTable dtMain = new DataTable();
dtMain.Columns.Add("SEQ", typeof(int)).AllowDBNull = true;
dtMain.Columns.Add("KAWAUSO_COL01", typeof(string)).AllowDBNull = true;
dtMain.Columns.Add("KAWAUSO_COL02", typeof(string)).AllowDBNull = true;
dtMain.Columns.Add("KAWAUSO_COL03", typeof(string)).AllowDBNull = true;
dr = dtMain.NewRow();
dr["SEQ"] = 1;
dr["KAWAUSO_COL01"] = "TESTVALUE01";
dr["KAWAUSO_COL02"] = "TESTVALUE02";
dr["KAWAUSO_COL03"] = "TESTVALUE03";
dtMain.Rows.Add(dr);
dr = dtMain.NewRow();
dr["SEQ"] = 2;
dr["KAWAUSO_COL01"] = "TESTVALUE01";
dr["KAWAUSO_COL02"] = "TESTVALUE02";
dr["KAWAUSO_COL03"] = "TESTVALUE03";
dtMain.Rows.Add(dr);
dr = dtMain.NewRow();
dr["SEQ"] = 3;
dr["KAWAUSO_COL01"] = "TESTVALUE01";
dr["KAWAUSO_COL02"] = "TESTVALUE02";
dr["KAWAUSO_COL03"] = "TESTVALUE03-01";
dtMain.Rows.Add(dr);
string targetCol01 = dtCondition.Rows[0]["Condition"].ToString();
string targetCol02 = dtCondition.Rows[1]["Condition"].ToString();
string targetCol03 = dtCondition.Rows[2]["Condition"].ToString();
var recSets = dtMain.AsEnumerable();
// LINQ 静的ラムダ式 → ここを動的にするにはどうすれば…
var q1 = from records in recSets
group records by new {
recCol01 = records.Field<string>(targetCol01),
recCol02 = records.Field<string>(targetCol02),
recCol03 = records.Field<string>(targetCol03)
} into record
select new {
recKey = record.Key,
recCount = record.Count()
};
var targets = q1.Where(x => x.recCount > 1);
}
}
}
---------------------------------------------------------------------------------