比较LINQ实体并获得差异

时间:2015-07-14 11:04:37

标签: c# linq entity-framework

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

我正在使用标准XmlSerializeDataLoadOptions作为序列化基础和相关实体。

因此,我需要实现比较器来区分数据库数据和来自闪存驱动器的反序列化数据。

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

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

2 个答案:

答案 0 :(得分:0)

您可以为此创建自己的方法。让我们说你有:

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

P.S。 它在性能方面应该没问题,但是如果你仍想使用LINQ - 尝试实现IEqualityComparer接口并将其实例作为第二个重载传递给.Except()方法。

答案 1 :(得分:0)

这个技巧可能适用于您的情况,也可能不适用,但如果有人发现它有用,我会分享这个技巧。

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

EF非常智能,可以检测更新的属性值何时与原始值匹配,而不是将这些实体标记为脏。然后,您可以检查实体状态,如果它未更改,则实体匹配。

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