我想要区分数据列表
我的代码:
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;
此代码不能正常工作数据
答案 0 :(得分:0)
这项挑战至少有3种解决方案:
对lambda表达式使用DistinctBy()
方法,例如:
var query = someData.DistinctBy(x => x.PropertyYouWantToDistinquishBy)
;
构建一个将实现接口IEqulityComparer<PendingGRemsResultRecord>
的equalityComparer,然后使用此类的实例作为重载od Distinct()
方法。
在IEquatable
课程中实施PendingGRemsResultRecord
界面(使用Equals
和GetHashCode
方法)。
答案 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
类中指定GetHashCode
和PendingGRemsResultRecord
,那么将通过引用比较此类的实例。即使它们具有相同的属性值,也会将所有实例视为不同。您有几种方法可以教Distinct()
方法查看值而不是比较引用(覆盖Equals
和GetHasCode
,创建并传递自定义比较器),但您也可以使用匿名对象的强大功能,它具有默认的Equals
和GetHashCode
实现,它们使用属性值来检查两个匿名对象是否相等。
这正是我在这里使用的 - 将源序列对象投影到具有GUID
和CreatorType
属性的匿名对象中。然后,通过匿名对象的默认比较功能,您可以使用Distinct()
仅获取具有不同guid和creator类型的对象。接下来是将不同结果简单地投射到PendingGRemsResultRecord
。