如何以最有效的方式基于通用的匹配键更新/合并两个巨大的List <Class>和C#中的数百个属性

我有两个大型的集合List<Class>,具有数百个属性。

例如原始集合List<OriginalCollection>和更新的集合List<UpdatedColleciton>

UpdatedCollection将包含某些列中的值,这些列很可能不是OriginalCollection的一部分,而UpdatedCollection可能具有某些 KeyColumn [ID列] 而不是OriginalCollection的一部分,并且我收到OriginalCollection中设置的数千个数据,而UpdatedColletion会在一段时间内增加记录。

我确实有一个要求,只有OriginalCollection的空列或空列应由匹配的UpdatedCollection值替换为 ID ,如果没有匹配的ID可用,则这些记录应该从OriginalCollection的{​​{1}}中添加。

我尝试使用UpdatedCollection,其中我尝试根据匹配ID使用AutoMapper更新OriginalCollection,为此我找不到我的集合中的任何UpdatedCollection上述要求。

我正在寻找最有效的解决方案,该解决方案不应影响性能,这就是为什么我没有采用典型的联合和交叉路口的方式,因为Modal拥有数百个属性,并且有成千上万条记录,而我确实拥有我认为像AutoMapper configuration之类的大量属性比在循环中编写逻辑以检查所有数千条记录的每一列上的值是更好的选择。

请提出任何更好且性能高效的解决方案,例如AutoMapper配置或任何其他.Net内置功能来实现此方案。

我还从https://github.com/AutoMapper/AutoMapper.CollectionAutoMapper进行了检查

AutoMapper.Collection

但是它具有以下行为,并且无法按我的要求正常工作

  1. 如果ID匹配,则会将OrderDTO映射到Order
  2. 如果存在OrderDTO且订单未添加到集合中不适用于我
  3. 如果存在Order,并且OrderDTO没有从集合中删除对我不工作
congine123 回答:如何以最有效的方式基于通用的匹配键更新/合并两个巨大的List <Class>和C#中的数百个属性

AutoMapper是已知的映射库,也具有良好的文档,但是找不到AutoMapper.Collection的类似的详细文档,我已经研究过AutoMapper.Collection,但并未提供解决方案。我的要求。

所以,我需要走传统的方式。

通过LINQ查询准备的收款差异。

 var common = original.Where(x => revised.Exists(z => z.ID == x.ID)).ToList();
 var nonCommon = revised.Where(x => !original.Exists(z => z.ID == x.ID)).ToList();

 foreach(var item in common)
 {
      var derived = revised.FirstOrDefault(x => x.ID == item.ID);

      // Added Extention Method to compare and update property
      var data = item.UpdateProperties(derived);
 }
 common.AddRange(nonCommon);

对于所有数据类型,利用反射来比较对象并在属性级别进行比较后更新其值。

public static T UpdateProperties<T>(this T source,T destination)
{
    Type type = source.GetType();   // Gets Source Object Type
    PropertyInfo[] props = type.GetProperties();    // Gets Source object Properties

    foreach (var prop in props)     // Iterate threw all properties of source object
    {
        var sourceValue = prop.GetValue(source);    // Get source object value by Property Name
        var destinationValue = prop.GetValue(destination);      // Get destination object value by Property Name,to update source object

        // Update source object property value only if derived object's property has value and source object doesn't
        if (string.IsNullOrEmpty(sourceValue?.ToString()) && !string.IsNullOrEmpty(destinationValue?.ToString()))
        {
            prop.SetValue(source,destinationValue);    // Update source object's property with value of derived object
        }
    }
    return source;
}
本文链接:https://www.f2er.com/3052279.html

大家都在问