如何在LINQ中查询重复名称的ID-Name对?

时间:2013-12-19 08:49:44

标签: c# linq

我有一个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());

粘贴这给了我一个线索!我必须只检查前八个字符中的重复项。

3 个答案:

答案 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子句中的匿名对象。