繁体   English   中英

比较LINQ实体并获得差异

[英]Comparing LINQ entities and getting difference

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

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

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

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

是否存在另一种比较实体并获取包含不同数据的对象的方法?

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

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

PS在性能方面应该没问题,但是如果您仍然想使用LINQ,请尝试实现IEqualityComparer接口,并将其实例传递给.Except()方法,这是第二次重载。

此技巧可能适用于您,也可能不适用,但如果有人觉得有用,我将与您分享。

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

EF足够聪明,可以检测更新的属性值何时与原始属性匹配,并且不会将这些实体标记为脏。 然后,您可以检查实体状态,如果状态不变,则表示实体匹配。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM