[英]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 :
通过使用默认的相等比较器比较值来产生两个序列的集合差异。
您需要通过覆盖GetHashCode
和Equals
来定义自定义比较。
默认的相等比较器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.