比较两个数据集-查找更改-LINQ
本文关键字:查找 -LINQ 数据集 两个 比较 | 更新日期: 2023-09-27 18:29:43
我在互联网上搜索了一下,试图找到一个解决方案,但也许我的做法不对。
我需要比较两个结构相同的数据集,并希望找到新的和更改的对象(使用LINQ)。
使用我在CodeProject中发现的内容,我能够将更改的项目列表汇总在一起,但这是通过对每一列(而且会有很多列)进行硬编码并检查相同的值来完成的:
var updRec = from u in updated
join o in orig
on u.KeyValue equals o.KeyValue
where
(o.Propery1 != u.Propery1) ||
(o.Propery2 != u.Propery2)
select new record
{
KeyValue = u.KeyValue,
Propery1 = u.Propery1,
Propery2 = u.Propery2 ,
RecordType = "mod" // Modified
};
我可以在两件事上得到帮助:
- 在我计划添加更多需要比较的属性时,是否有更有效的方法来循环遍历每一列?必须有一种更好的方法来动态检查两个相同的数据集的更改
- 如何查看哪个属性发生了更改例如,为所有不相同的项创建一个"Property,OriginalValue,UpdatedValue"列表
希望这能很好地解释。如果我没有正确看待这种情况,请随时向我指出处理这种情况的其他方法。
您可以使用LINQ Exception()扩展方法。它返回列表中的所有内容,除了第二个列表中的内容。
var orignalContacts = GetOrignal();
var updatedContacts = GetUpdated();
var changedAndNew = updatedContacts.Except(orignalContacts);
var unchanged = orignalContacts.Except(updatedContacts);
根据您的数据提供程序,您可能需要在对象上重写Equals()和GetHashCode()。
- 更快,但如果添加新属性,则需要维护代码。这是为了编写自定义比较器并使用您的方法
-
较慢的使用反射遍历所有属性并动态比较它们
IDictionary<string, Tuple<object, object>> GetDifferentProperties<T>(T keyValue1, T keyValue2) { var diff = new Dictionary<string, object>(); foreach (var prop in typeof(T).GetProperties(BindingFlags.Public)) { var prop1Value = prop.GetValue(keyvalue1); var prop2Value = prop.GetValue(keyValue2); if (prop1Value != prop2Value) diff.Add(prop.Name, Tuple.Create(prop1Value, prop2Value)); } return diff; }
然后在你的代码
var = results = (from u in updated
join o in orig
select new
{
Value1 = o.KeyValue,
Value2 = u.KeyValue
}).ToArray()
.Select(x => GetDifferentProperties(x.Value1, x.Value2))
.Select(DoSomestufWithDifference);