C#
var actives = dt.Where(r => r["IsActive"].ToString()== "1");
// ❌これは動かない
var actives = dt.Where(r => r["IsActive"].ToString()== "1");
// ↑ 'DataTable'に'Where'の定義はない
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は下の記事に登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
10 件using System.Data; using System.Linq; // using System.Data.DataSetExtensions; // .NET Framework 4.0以降は標準で参照済みのはず未収録
前提:AsEnumerable()でIEnumerable化する
#a9874e6cceab
//価格1000以上、かつ"在庫あり"のフラグが立ってる行を抽出 var filtered = dt.AsEnumerable() .Where(r => r.Field<int>("price")>= 1000 && r.Field<bool>("in_stock"));
▶ 実行可
パターン1:フィルタ(Where)
#4d40bef0f3f9
//カテゴリ別の件数と合計金額 var summary = dt.AsEnumerable() .GroupBy(r => r.Field<string>("category")) .Select(g => new
▶ 実行可
パターン2: GroupBy +集計(Sum / Count / Average)
#4012f8c5d3ba
//価格1000以上の行だけ別DataTableに分割 var highPriceRows = dt.AsEnumerable() .Where(r => r.Field<int>("price")>= 1000);未収録
パターン3:分割(CopyToDataTable / ImportRow)
#59d35ff0dae0
DataTable dtCopy = dt.Clone(); //スキーマだけコピー foreach (var r in highPriceRows) { dtCopy.ImportRow(r);未収録
パターン3:分割(CopyToDataTable / ImportRow)
#7a058a47bdcf
// ❌ NG: NULL許容な列にField<int>を使うとNULL行で例外 var prices = dt.AsEnumerable() .Select(r => r.Field<int>("amount"))// amountがNULLの行で例外(Typed DataSetならStrongTypingException、一般ADO.NETではInvalidCastException) .ToList();未収録
DBNullのハマり:Field vs Field<int?>
#765e4bcb985a
