2つのデータテーブルがある場合:
DT1 & DT2
最初のものに2番目のものが含まれているかどうかを確認する方法、つまり、の同じ行がにあることを意味しDT2
ますDT1
。
テーブルとcomapareフィールド(できればIDだけ)をループします。データテーブルの構造に応じて、これを行う方法はいくつかあります。
私の質問:「すべての行のフィールドが他のDataTableの同じ行のフィールドと一致する必要がありますか?」
あなたの答え:「IDだけではない」
最初に、両方DataTables
がnullであるか、または両方が同じ行数を持っているかどうかを確認できます。次に、LINQを使用して、次を使用して両方が同じIDを持っているかどうかを判断できますEnumerable.Except
。
var dt1IDs = DT1.AsEnumerable().Select(r => r.Field<int>("id"));
var dt2IDs = DT2.AsEnumerable().Select(r => r.Field<int>("id"));
var diff = dt1IDs.Except(dt2IDs);
var equal = DT1.Rows.Count == DT2.Rows.Count && !diff.Any();
説明:diff.Any()
DT2にないIDがDT1に少なくとも1つある場合、trueを返します。
編集:IDが一意でなく、繰り返される可能性がある場合は、DT1のすべてのIDがDT2にもあり、DT2のすべてのIDがDT1にあるかどうかを確認する必要があります。
var DT1InDT2 = dt1IDs.Except(dt2IDs);
var DT2InDT1 = dt2IDs.Except(dt1IDs);
var equal = DT1.Rows.Count == DT2.Rows.Count && !DT1InDT2.Any() && !DT2InDT1.Any();
このクエリはとにかく効率的です。
Edit2:私はあなたのrequiremnetを少し誤解しているのを見たばかりです。最初のテーブルに2番目のテーブルが含まれているかどうかだけを知りたいのであり、その逆はありません。
var DT2IdNotInDT1 = dt2IDs.Except(dt1IDs);
var equal = !DT2IdNotInDT1.Any();
Intersect演算子を使用できます
var cross = DT2.AsEnumerable()。Intersect(DT1.AsEnumerable()、DataRowComparer.Default);