EF6中使用except-don';不起作用

本文关键字:不起作用 except-don EF6 | 更新日期: 2023-09-27 18:19:31

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

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的助理,还有一个列表包含了名为assistancesWithExpertexpert的助理,我需要计算assistanceWithoutExpert。那么,在执行后,结果是AllAssitance中的所有记录,为什么?

向致以最良好的问候

EF6中使用except-don';不起作用

您需要使用带比较器的重载。对于复杂的类型,它不能开箱即用。

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;
}

不过,如果你想在一些不唯一的字段上进行比较,请注意警告。请参阅此链接。