簡體   English   中英

EF6中的兩個列表之間的區別,使用except不起作用

[英]Difference Between Two Lists in EF6 using except doesn't work

我試圖計算兩個列表之間的差異,我的列表類型具有以下結構:

public partial class Assistance
{

    public int Id { get; set; }
    public string AssistanceName { get; set; }
    public string AssistanceTell { get; set; }
}

這是我的查詢:

           List<Assistance> assistanceWithoutExpert;
            AssistanceJurorRepository assistanceJurorRepository = new AssistanceJurorRepository();

            List<Assistance> assistancesWithExpert = assistanceJurorRepository.FindBy(i => i.User.Permission == "Assistance").Select(i => i.Assistance).ToList();
            List<Assistance> AllAssitance = GetAll().ToList();
            assistanceWithoutExpert = AllAssitance.Except(assistancesWithExpert).ToList();
            return assistanceWithoutExpert;

正如你可以看到我有持有召集所有assitances列表AllAssitance並持有assitances已經列表expert稱為assistancesWithExpert我需要計算assistanceWithoutExpert 。所以,但執行的結果后的所有記錄在AllAssitance為什么呢?

最好的祝福

您需要使用需要比較器重載 對於復雜類型,它開箱即用。

public class AssistanceComparer: IEqualityComparer<Assistance>
{
    public bool Equals(Assistance x, Assistance y)
    {
        return x.ID == y.ID;
    }

    public int GetHashCode(Assistance assistance)
    {
        return assistance.ID.GetHashCode();
    }
}

用法:

assistanceWithoutExpert = AllAssitance.Except(assistancesWithExpert, new AssistanceComparer()).ToList();

使用默認的相等比較器完成比較。 MSDN

通過使用默認的相等比較器比較值來產生兩個序列的集合差異。

您需要通過覆蓋GetHashCodeEquals來定義自定義比較。

默認的相等比較器Default用於比較實現IEqualityComparer通用接口的類型的值。 要比較自定義數據類型,您需要實現此接口並為該類型提供自己的GetHashCode和Equals方法。

簡而言之,如果您想通過Id屬性比較實例,則需要在Assistence類中添加以下代碼。

public override int GetHashCode() {
    return Id.GetHashCode();
}

public override bool Equals(obj otherInstance) {
    return (otherInstance is Assistence) && ((Assistence)otherInstance).Id == Id;
}

但是,如果您要在不唯一的某個字段上進行比較,則需要注意警告。 看到這個鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM