我有兩個數據表中的行和我想選擇從第一個,其不存在於第二個比較兩個數據表,並選擇不存在於第二個表
例如行:
Table A id column 1 data1 2 data2 3 data3 4 data4 Table B id column 1 data10 3 data30
我想要得到的結果是:
Table C id column 2 data2 4 data4
我有兩個數據表中的行和我想選擇從第一個,其不存在於第二個比較兩個數據表,並選擇不存在於第二個表
例如行:
Table A id column 1 data1 2 data2 3 data3 4 data4 Table B id column 1 data10 3 data30
我想要得到的結果是:
Table C id column 2 data2 4 data4
您可以使用LINQ,尤其是Enumerable.Except
有助於找到ID在表A不在表B:
var idsNotInB = TableA.AsEnumerable().Select(r => r.Field<int>("id"))
.Except(TableB.AsEnumerable().Select(r => r.Field<int>("id")));
DataTable TableC = (from row in TableA.AsEnumerable()
join id in idsNotInB
on row.Field<int>("id") equals id
select row).CopyToDataTable();
您還可以使用Where
但它會是低效率:
DataTable TableC = TableA.AsEnumerable()
.Where(ra => !TableB.AsEnumerable()
.Any(rb => rb.Field<int>("id") == ra.Field<int>("id")))
.CopyToDataTable();
非常感謝您的回答。您的解決方案適合我。 – Catalin
我有沒有哪LINQ有效的解決方案:
public DataTable CompareDataTables(DataTable first, DataTable second)
{
first.TableName = "FirstTable";
second.TableName = "SecondTable";
//Create Empty Table
DataTable table = new DataTable("Difference");
try
{
//Must use a Dataset to make use of a DataRelation object
using (DataSet ds = new DataSet())
{
//Add tables
ds.Tables.AddRange(new DataTable[] { first.Copy(), second.Copy() });
//Get Columns for DataRelation
DataColumn[] firstcolumns = new DataColumn[ds.Tables[0].Columns.Count];
for (int i = 0; i < firstcolumns.Length; i++)
{
firstcolumns[i] = ds.Tables[0].Columns[i];
}
DataColumn[] secondcolumns = new DataColumn[ds.Tables[1].Columns.Count];
for (int i = 0; i < secondcolumns.Length; i++)
{
secondcolumns[i] = ds.Tables[1].Columns[i];
}
//Create DataRelation
DataRelation r = new DataRelation(string.Empty, firstcolumns, secondcolumns, false);
ds.Relations.Add(r);
//Create columns for return table
for (int i = 0; i < first.Columns.Count; i++)
{
table.Columns.Add(first.Columns[i].ColumnName, first.Columns[i].DataType);
}
//If First Row not in Second, Add to return table.
table.BeginLoadData();
foreach (DataRow parentrow in ds.Tables[0].Rows)
{
DataRow[] childrows = parentrow.GetChildRows(r);
if (childrows == null || childrows.Length == 0)
table.LoadDataRow(parentrow.ItemArray, true);
}
table.EndLoadData();
}
}
}
有關詳情,請訪問http://microsoftdotnetsolutions.blogspot.in/2012/12/compare-two-datatables.html
您可以使用Linq Enumerable.Except方法功能n在兩個DataTable之間獲得差異在這裏,我使用firstDt和secondDt,記住兩個Dt都具有相同的結構。
var EntriesNotInB = firstDt.AsEnumerable().Select(r => r.Field<string>("abc")).Except(secondDt.AsEnumerable().Select(r => r.Field<string>("abc")));
if (EntriesNotInB.Count() > 0)
{
DataTable dt = (from row in firstDt.AsEnumerable()join id in EntriesNotInB on row.Field<string>("abc") equals id select row).CopyToDataTable();
foreach (DataRow row in dt.Rows)
{
/////Place your code to manipulate on datatable Rows
}
}
要了解更多關於Enumerable.Except方法,去http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except(v=vs.110).aspx
和對其做!!!!快樂編碼.........
你的代碼到目前爲止看起來如何? – apomene