我有一个LINQ to Objects查询,它返回一个列表:
class EmpMasterIDocBuffer
{
public int Index { get; set; }
public Int64 AutoId { get; set; }
public string Buffer { get; set; }
}
它是正确排序的,以便在网格中很容易看到重复的缓冲区值,但我该如何查询?当Buffer重复时,AutoId也将重复,例如
1 - 弗雷德
2 - 玛丽
2 - 玛丽
3 - 简
4 - 比尔
但索引永远是唯一的。
我删除了Index
,因为这只是我想要的一个想法,但这是我的实际代码,它返回零项,而我知道至少有三个相同的类。
var docs = ctx.Database.SqlQuery<SapIdocEmployeeNumber>("select AutoId, IDoc.query('data(ZHREMPMASTER/IDOC/ZHRSA_EMPMASTER01000/BUFFER)') AS Buffer from SAPIDocs").Where(i => !string.IsNullOrWhiteSpace(i.EmployeeNumber)).ToList();
var lastDup = docs
//.Where(i => i.AutoId == 42)
.GroupBy(i => i.EmployeeNumber)
.Where(g => g.Count() > 1)
.Select(g => g.Last());
粘贴这给了我一个线索!我必须只检查前八个字符中的重复项。
答案 0 :(得分:5)
...以便在网格中很容易看到重复的缓冲区值,但是 我怎么查询呢?
所以你想要显示重复项?
您可以使用GroupBy
:
var duplicates = buffers
.GroupBy(b => b.Buffer)
.Where(g => g.Count() > 1)
.Select(g => g.First()):
如果您想要显示非重复项,请使用g.Count() == 1
。
如果您想删除重复项:
var uniques = buffers
.GroupBy(b => b.Buffer)
.Select(g => g.First()):
答案 1 :(得分:0)
distinct在linq to object的情况下不起作用有两个选项,一个是group by,另一个是Comparer,如下所示
namespace Application.Core.Common
{
using System.Collections.Generic;
public class EmpMasterIDocBufferComparer : IEqualityComparer<EmpMasterIDocBuffer>
{
/// <summary>
/// Equality check
/// </summary>
/// <param name="x">EmpMasterIDocBuffer x</param>
/// <param name="y">EmpMasterIDocBuffer y</param>
/// <returns>Returns true false</returns>
public bool Equals(EmpMasterIDocBuffer x, EmpMasterIDocBuffer y)
{
if (x.Index== y.ANUPFROM
&& x.AutoId == y.ANUPTOM
&& x.Buffer== y.Buffer, System.StringComparison.OrdinalIgnoreCase))
{
return true;
}
return false;
}
/// <summary>
/// To get hash code
/// </summary>
/// <param name="obj">ANSU object</param>
/// <returns>UTYP id</returns>
public int GetHashCode(EmpMasterIDocBuffer obj)
{
return obj == null ? 0 : obj.Index;
}
}
}
并且以下面的方式调用不同的调用
IEqualityComparer<EmpMasterIDocBuffer> comparer = new EmpMasterIDocBufferComparer();
var distinctList = EmpMasterIDocBufferCollection.Distinct(comparer).ToList();
答案 2 :(得分:0)
对我而言,Tim Schmelter的答案是最好的。我只有一个小修改。如果Buffer属性相同但AutoId不相同,那么该项仍将被包含,尽管它不是重复的。而不是按缓冲区分组,而是按包含所需属性的匿名类型对项目进行分组:
//'list' is the list with items
var duplicates = list.GroupBy(x => new { x.AutoId, x.Buffer })
.Where(g => g.Count() > 1)
.Select(s => s.First());
因此,如果所有属性值相等,则该类将具有更多属性并且它们只是重复的,此方法将考虑到这一点。只需将属性添加到GroupBy子句中的匿名对象。