使用EF6时两个列表之间的差异除外不起作用

时间:2014-08-27 11:54:06

标签: c# entity-framework lambda except

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

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中的所有记录都是为什么?

祝你好运

2 个答案:

答案 0 :(得分:2)

您需要使用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();

答案 1 :(得分:1)

使用默认的相等比较器完成比较。来自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