我有这两个数据表,我希望得到它们之间的区别。这是一个例子:
Table1
-------------------------
ID | Name
--------------------------
1 | A
2 | B
3 | C
--------------------------
Table2
-------------------------
ID | Name
--------------------------
1 | A
2 | B
--------------------------
我只想将结果作为table1中的数据,而不是table2中的数据(table1-table2)
ResultTable
-------------------------
ID | Name
--------------------------
3 | C
--------------------------
我尝试通过Linq使用这两个类似的解决方案,但它总是返回table1而不是table1-table2。这是第一个解决方案:
DataTable table1= ds.Tables["table1"];
DataTable table2= ds.Tables["table2"];
var diff= table1.AsEnumerable().Except(table2.AsEnumerable(),DataRowComparer.Default);
第二个解决方案:
var dtOne = table1.AsEnumerable();
var dtTwo = table2.AsEnumerable();
var difference = dtOne.Except(dtTwo);
那么,错误在哪里?非常感谢你的所有答案。 :)
答案 0 :(得分:7)
您可以尝试以下代码......
table1.AsEnumerable().Where(
r =>!table2.AsEnumerable().Select(x=>x["ID"]).ToList().Contains(r["ID"])).ToList();
答案 1 :(得分:5)
我刚刚完成了这个并希望分享我的发现。对于我的应用程序,它是一个数据同步机制,但我想你会看到这是如何适用于原始问题。
在我的情况下,我有一个DataTable
代表我的最后数据上传,将来的某个时候,我需要获得当前状态数据,只上传差异。
// get the Current state of the data
DataTable dtCurrent = GetCurrentData();
// get the Last uploaded data
DataTable dtLast = GetLastUploadData();
dtLast.AcceptChanges();
// the table meant to hold only the differences
DataTable dtChanges = null;
// merge the Current DataTable into the Last DataTable,
// with preserve changes set to TRUE
dtLast.Merge(dtCurrent, true);
// invoke GetChanges() with DataRowState.Unchanged
// !! this is the key !!
// the rows with RowState == DataRowState.Unchanged
// are the differences between the 2 tables
dtChanges = dtLast.GetChanges(DataRowState.Unchanged);
我希望这会有所帮助。我和他一起打了几个小时,在interwebz上找到了很多假引线,最后在合并几种不同的方式后比较了RowStates
答案 2 :(得分:1)
我会尝试在列级别而不是DataTable上执行此操作。
IEnumerable<int> id_table1 = table1.AsEnumerable().Select(val=> (int)val["ID"]);
IEnumerable<int> id_table2 = table2.AsEnumerable().Select(val=> (int)val["ID"]);
IEnumerable<int> id_notinTable1= id_table2.Except(id_table1);
只需在答案中添加.Select()
答案 3 :(得分:1)
尝试以下,这是非常基本的。合并两套,并获得差异。如果套装没有正确对齐,那么这将不起作用。 试图测试相同的
DataSet firstDsData = new DataSet();
DataSet secondDsData = new DataSet();
DataSet finalDsData = new DataSet();
DataSet DifferenceDataSet = new DataSet();
finalDsData.Merge(firstDsData);
finalDsData.AcceptChanges();
finalDsData.Merge(secondDsData);
DifferenceDataSet = finalDsData.GetChanges();
答案 4 :(得分:0)
尝试以下方法:
初始化:
var columnId = new DataColumn("ID", typeof (int));
var columnName = new DataColumn("Name", typeof (string));
var table1 = new DataTable();
table1.Columns.AddRange(new[] {columnId, columnName});
table1.PrimaryKey = new[] {columnId};
table1.Rows.Add(1, "A");
table1.Rows.Add(2, "B");
table1.Rows.Add(3, "C");
var table2 = table1.Clone();
table2.Rows.Add(1, "A");
table2.Rows.Add(2, "B");
table2.Rows.Add(4, "D");
解决方案:
var table3 = table1.Copy();
table3.AcceptChanges();
table3.Merge(table2);
var distinctRows = from row in table3.AsEnumerable()
where row.RowState != DataRowState.Modified
select row;
var distintTable = distinctRows.CopyToDataTable();
当table2中的新行没有出现在table1中时,上面的解决方案也可以工作。
distintTable
constains C 和 D 。
答案 5 :(得分:0)
尝试以下,这是非常基本的。合并两套,并获得差异。如果套装没有正确对齐,那么这将不起作用。
DataSet firstDsData = new DataSet();
DataSet secondDsData = new DataSet();
DataSet finalDsData = new DataSet();
DataSet DifferenceDataSet = new DataSet();
finalDsData.Merge(firstDsData);
finalDsData.AcceptChanges();
finalDsData.Merge(secondDsData);
DifferenceDataSet = finalDsData.GetChanges();
答案 6 :(得分:-1)
Try This ...
public DataTable getDiffRecords(DataTable dtDataOne, DataTable dtDataTwo)
{
DataTable returnTable = new DataTable("returnTable");
using (DataSet ds = new DataSet())
{
ds.Tables.AddRange(new DataTable[] { dtDataOne.Copy(), dtDataTwo.Copy() });
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];
}
DataRelation r1 = new DataRelation(string.Empty, firstColumns, secondColumns, false);
ds.Relations.Add(r1);
DataRelation r2 = new DataRelation(string.Empty, secondColumns, firstColumns, false);
ds.Relations.Add(r2);
for (int i = 0; i < dtDataOne.Columns.Count; i++)
{
returnTable.Columns.Add(dtDataOne.Columns[i].ColumnName, dtDataOne.Columns[i].DataType);
}
returnTable.BeginLoadData();
foreach (DataRow parentrow in ds.Tables[0].Rows)
{
DataRow[] childrows = parentrow.GetChildRows(r1);
if (childrows == null || childrows.Length == 0)
returnTable.LoadDataRow(parentrow.ItemArray, true);
}
foreach (DataRow parentrow in ds.Tables[1].Rows)
{
DataRow[] childrows = parentrow.GetChildRows(r2);
if (childrows == null || childrows.Length == 0)
returnTable.LoadDataRow(parentrow.ItemArray, true);
}
returnTable.EndLoadData();
}
return returnTable;
}