|
2019/02/25(Mon) 22:36:43 編集(投稿者)
■No90316 (Kawauso さん) に返信 > // 重複しているレコードの主キー(SEQ)を列挙する場合 > IEnumerable<int> conflictSEQ = dtMain.AsEnumerable() > // .Where(row => row.Field<string>("KAWAUSO_COL01") != "" & > // row.Field<string>("KAWAUSO_COL02") != "" & > // row.Field<string>("KAWAUSO_COL03") != "") > .Select(row => new { row, key = new StringItems(conditions.Select(colName => row.Field<string>(colName)).ToArray()) }) > .GroupBy(x => x.key, x => x.row).Where(x => x.Skip(1).Any()) > .SelectMany(x => x.Select(r => r.Field<int>("SEQ")));
「x != "" & y != "" & z != ""」 でも間違いではありませんが、 「x != "" && y != "" && z != ""」 の方が望ましいですね。
それと、今回の列は AllowDBNull = true となっていますが、 『row.Field<string>("KAWAUSO_COL01") != ""』という条件で拾えるのは、 dr["KAWAUSO_COL01"] = ""; の場合だけであり、 dr["KAWAUSO_COL01"] = null; dr["KAWAUSO_COL01"] = DBNull.Value; は拾えない点にもご注意ください。
もしも上記いずれも拾いたいのであれば、 『!string.IsNullOrEmpty(dr.Field<string>("KAWAUSO_COL01"))』 のようにします。
// 「すべての列に値が入っている行」を取得する場合 var q1 = dtMain.AsEnumerable().Where(r => conditions.All(c => !string.IsNullOrEmpty(r.Field<string>(c))));
// 「いずれかの列に値が入っている行」を取得する場合 var q2 = dtMain.AsEnumerable().Where(r => conditions.Any(c => !string.IsNullOrEmpty(r.Field<string>(c))));
// 「すべての列に値が入っていない行」を取得する場合 var q3 = dtMain.AsEnumerable().Where(r => conditions.All(c => string.IsNullOrEmpty(r.Field<string>(c))));
// 「いずれかの列に値が入っていない行」を取得する場合 var q4 = dtMain.AsEnumerable().Where(r => conditions.Any(c => string.IsNullOrEmpty(r.Field<string>(c))));
|