次のシナリオがあります。
50 レコードのテーブル A と 2 レコードのテーブル B。
テーブル B に存在しないテーブル A からの 48 レコードを含む必要がある TableDiff など、新しいテーブルを定義する必要があります。
私の問題は、テーブル A とテーブル B は同一ではありませんがrowId
、両方のテーブルに存在するフィールドを使用して比較する必要があることです。
次のシナリオがあります。
50 レコードのテーブル A と 2 レコードのテーブル B。
テーブル B に存在しないテーブル A からの 48 レコードを含む必要がある TableDiff など、新しいテーブルを定義する必要があります。
私の問題は、テーブル A とテーブル B は同一ではありませんがrowId
、両方のテーブルに存在するフィールドを使用して比較する必要があることです。
Enumerable.Except
と を使用した一方向Enumerable.Join
:
var aIDs = TableA.AsEnumerable().Select(r => r.Field<int>("RowID"));
var bIDs = TableB.AsEnumerable().Select(r => r.Field<int>("RowID"));
var diff = aIDs.Except(bIDs);
DataTable tblDiff = (from r in TableA.AsEnumerable()
join dId in diff on r.Field<int>("RowID") equals dId
select r).CopyToDataTable();
linq-to-objects の「左結合」アプローチは次のとおりです。
DataTable tblDiff = (from rA in TableA.AsEnumerable()
join rB in TableB.AsEnumerable()
on rA.Field<int>("RowID") equals rB.Field<int>("RowID") into joinedRows
from ab in joinedRows.DefaultIfEmpty()
where ab == null
select rA).CopyToDataTable();
using System.Data.DataSetExtensions
var tableAIds = tableA.AsEnumerable().Select(row => (int)row["rowId"]);
var tableBIds = tableB.AsEnumerable().Select(row => (int)row["rowId"]);
var resultantIds = tableAIds.Except(tableBIds);
今すぐデータテーブルを再度作成します
DataTable diff = from myRow in tableA.AsEnumerable()
join rIDS resultantIds in myRow.Field<int>("rowId") equals rIDS
select myRow).CopyToDataTable()