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

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

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

C# LINQ IEnumerableからDataTable [1]

[トピック内 21 記事 (21 - 21 表示)]  << 0 | 1 >>

■90317 / inTopicNo.21)  Re[14]: C# LINQ IEnumerableからDataTable
  
□投稿者/ 魔界の仮面弁士 (2079回)-(2019/02/25(Mon) 21:48:30)
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))));
引用返信 編集キー/

このトピックをツリーで一括表示

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ