比较LINQ实体并得到差异

本文关键字:LINQ 实体 比较 | 更新日期: 2023-09-27 18:02:40

我正在用闪存驱动器为我的数据库编写同步系统。因此,flash上有一个xml文件,内容由实体的GUID获取。

我使用标准的XmlSerializeDataLoadOptions序列化基础和相关实体。

因此,我需要实现比较器来获取数据库数据和闪存盘反序列化数据之间的差异。

我尝试使用Linq Except<>方法,但它说相同的实体是不同的。

是否有另一种方法来比较实体和获取对象,其中包含不同的数据?

比较LINQ实体并得到差异

您可以为此创建自己的方法。假设你有:

interface IEntity
{
    int Id { get; set; }
}
和实现它的具体类:
class Entity : IEntity
{
    public int Id { get; set; }
}

你可以创建这样的方法:

    static ICollection<T> Compare<T>(ICollection<T> list1, ICollection<T> list2) where T : IEntity
    {
        List<T> result = new List<T>();
        foreach (T item in list1) if(!list2.Any(e => e.Id == item.Id)) result.Add(item);
        foreach (T item in list2) if (!list1.Any(e => e.Id == item.Id)) result.Add(item);
        return result;
    }

用法:

List<IEntity> list1 = new List<IEntity>() { new Entity() { Id = 1 }, new Entity() { Id = 10 } };
List<IEntity> list2 = new List<IEntity>() { new Entity() { Id = 1 }, new Entity() { Id = 5 } };
List<IEntity> result = Compare(list1, list2).ToList();
foreach (IEntity item in result)
{
    Console.WriteLine(item.Id);
}

输出:5,10

注:在性能方面应该是ok的,但如果你仍然想使用LINQ -尝试实现IEqualityComparer接口,并将它的实例传递给. except()方法作为第二个重载。

此技巧可能适用于您的情况,也可能不适用,但我将此分享给您,以防有人发现它很有用。

您可以使用automapper将来自xml的实体映射到来自DB的实体。(你需要先从数据库加载你的实体到内存)。

EF足够智能,可以检测更新的属性值是否与原始值匹配,而不会将这些实体标记为脏的。然后您可以检查实体状态,如果它没有改变,则实体匹配。

if (myDbContext.Entry(entity).State != EntityState.Unchanged) 
... etc