【问题标题】:Difference Between Two Lists in EF6 using except doesn't workEF6中两个列表之间的区别使用除了不起作用
【发布时间】:2026-02-15 23:05:01
【问题描述】:

我正在尝试计算两个列表之间的差异,我的列表类型具有这种结构:

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;

如您所见,我有一个包含所有帮助的列表,称为AllAssitance,还有一个包含expert 的帮助的列表,称为assistancesWithExpert,我需要计算assistanceWithoutExpert。所以,但在执行后结果就是所有记录在AllAssitance 为什么?

最好的问候

【问题讨论】:

  • 用你自己的方法覆盖 EqualsGetHashCode 方法。
  • @Tony 我不熟悉你所说的这些。你的意思是我应该在 dbcontext 中覆盖该方法?
  • 您是否在Assistance 中覆盖了Equals()GetHashCode()
  • @flindeberg 不,我没有
  • 请注意,覆盖 Equals()GetHashCode() 可能有点棘手。您可能想先阅读这些guidelines and rules。但这绝对是要走的路。

标签: c# entity-framework lambda except


【解决方案1】:

您需要使用overload which takes a comparer。它不适用于复杂类型的开箱即用。

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();

【讨论】:

【解决方案2】:

使用默认的相等比较器进行比较。来自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;
}

如果您想在某些不唯一的字段上进行比较,请注意警告。见this link

【讨论】: