簡體   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