C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 155 を表示中)
■90304 / )  Re[8]: C# LINQ IEnumerableからDataTable
□投稿者/ Kawauso (7回)-(2019/02/25(Mon) 10:46:12)
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);

        }
    }
}
---------------------------------------------------------------------------------

返信 編集キー/


管理者用

- Child Tree -