2013-12-19 35 views
1

我有一個LINQ到對象的查詢返回的列表:如何在LINQ中查詢重名名稱中的ID-Name對?

class EmpMasterIDocBuffer 
{ 
    public int Index { get; set; } 
    public Int64 AutoId { get; set; } 
    public string Buffer { get; set; } 
} 

它被正確排序,以便複製緩衝器中值將在網格中很容易看到,但我該如何查詢呢?當緩衝區重複時,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()); 

粘貼這給了我一個線索!我只能檢查前八個字符中的重複項。

+2

你可以使用'獨特' – Satpal

+0

獨特將刪除重複。我想識別它們。 – ProfK

回答

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-clause中的匿名對象即可。

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()): 
+0

「所以你想要如何重複?你想在這裏說什麼? – RononDex

+0

@RononDex:應該是「秀」,謝謝。 's'不知何故就消失了。 –

0

明顯不會在LINQ的情況下,工作對象有兩個選項一個是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(); 
+0

distinct **將**工作,但使用默認比較器 – Grundy

+0

不僅原始類型有默認比較器嗎? – ProfK

+0

不明白你的問題你能否更清楚 –