实体框架中的独特记录

时间:2014-01-26 09:36:57

标签: c# entity-framework

我想要区分数据列表

我的代码:

PendingGRemsResult _Return = new PendingGRemsResult();

_Return.PendingGRemsResultRecord = Context.Where(a => a.Status == 0)
   .Select(s => new PendingGRemsResultRecord
     { GUID = s.GRemGUID.GUID,
       Count = App.GroupedRemittance
         .GetByFilter((gr => gr.GRemGUID.GUID == s.GRemGUID.GUID))
         .Count(),
       CreatorType = s.GRemGUID.CreatorType.Value})
  .Distinct()
  .ToList();

return _Return;

此代码不能正常工作数据

2 个答案:

答案 0 :(得分:0)

这项挑战至少有3种解决方案:

  1. 对lambda表达式使用DistinctBy()方法,例如:

    var query = someData.DistinctBy(x => x.PropertyYouWantToDistinquishBy);

  2. 构建一个将实现接口IEqulityComparer<PendingGRemsResultRecord>的equalityComparer,然后使用此类的实例作为重载od Distinct()方法。

  3. IEquatable课程中实施PendingGRemsResultRecord界面(使用EqualsGetHashCode方法)。

答案 1 :(得分:0)

_Return.PendingGRemsResultRecord = 
     Context.Where(a => a.Status == 0)
            .Select(a => new {
               a.GRemGUID.GUID, 
               CreatorType = a.s.GRemGUID.CreatorType.Value })
            .Distinct()
            .Select(x => new PendingGRemsResultRecord {
                  GUID = x.GUID,
                  Count = App.GroupedRemittance
                             .GetByFilter(gr => gr.GRemGUID.GUID == x.GUID)
                             .Count(),
                  CreatorType = x.CreatorType
              }).ToList();

更新:它是如何工作的 - 因此您没有在Equals类中指定GetHashCodePendingGRemsResultRecord,那么将通过引用比较此类的实例。即使它们具有相同的属性值,也会将所有实例视为不同。您有几种方法可以教Distinct()方法查看值而不是比较引用(覆盖EqualsGetHasCode,创建并传递自定义比较器),但您也可以使用匿名对象的强大功能,它具有默认的EqualsGetHashCode实现,它们使用属性值来检查两个匿名对象是否相等。

这正是我在这里使用的 - 将源序列对象投影到具有GUIDCreatorType属性的匿名对象中。然后,通过匿名对象的默认比较功能,您可以使用Distinct()仅获取具有不同guid和creator类型的对象。接下来是将不同结果简单地投射到PendingGRemsResultRecord