2014-09-02 17 views
1

我正在使用以下Linq來確定在我的列表中是否有任何無效條目在一些自定義驗證過程中 - 我想知道是否有人被分配了根據他們的工作,其中本公司相同數量的正常工作:使用Linq獲取列表中基於2個字段的重複條目列表

var duplicates = Persons.GroupBy(x => 
       new { x.Number, x.CompanyId}, (key) => new { key.Number, key.CompanyId }) 
       .Where(y => y.Count() > 1); 

對於一個簡單的類人:

class Person 
{ 
    public string Name { get; set; } 
    public int Number { get; set; } 
    public int CompanyId { get; set; } 
} 

因此,建立一些測試數據:

List<Person> Persons = new List<Person>(); 
// add people (users would do this!) 
Persons.Add(new Person() { Name = "Person 1", Number = 1, CompanyId = 1 }); // invalid 
Persons.Add(new Person() { Name = "Person 2", Number = 2, CompanyId = 1 }); 
Persons.Add(new Person() { Name = "Person 3", Number = 3, CompanyId = 1 }); 
Persons.Add(new Person() { Name = "Person 4", Number = 1, CompanyId = 1 }); // invalid 
Persons.Add(new Person() { Name = "Person 5", Number = 2, CompanyId = 2 }); // invalid 
Persons.Add(new Person() { Name = "Person 6", Number = 2, CompanyId = 2 }); // invalid 

檢查是否有重複和手柄:

var duplicates = Persons.GroupBy(x => 
       new { x.Number, x.CompanyId}, (key) => new { key.Number, key.CompanyId }) 
       .Where(y => y.Count() > 1); 

if (duplicates.Any()) 
{ 
    // build a string 
} 

我想要做的是讓無效的條目列表,並通知用戶。因此,在上述情況下,我想要輸出以下文本:

  • 人1和人4已被分配到公司#1的相同編號#1。
  • 第5號公司和第6號公司已爲第2號公司分配了相同的號碼#2。
+0

你有沒有像... Persons.Where(p =>(p.Number == p.CompanyId))這樣的東西,然後將結果分組 – Lloyd 2014-09-02 19:30:18

+0

Number == Company?這不會起作用,因爲Number與公司沒有任何關係。每家公司都有自己的編號系統。號碼和公司必須爲GroupBy中的鑰匙。 – Andez 2014-09-02 19:33:16

+0

您應該澄清爲什麼人員號碼或公司ID無效,是因爲重複的號碼還是什麼! – Lloyd 2014-09-02 19:50:10

回答

1

更改您的羣組,通過返回名稱作爲選擇並按您的密鑰分組。隨後的string.join將合併列表

var duplicates = Persons 
    .GroupBy(key => new { key.Number, key.CompanyId }, a=>a.Name) 
    .Where(y => y.Count() > 1); 

var sb = new StringBuilder(); 
foreach (var duplicate in duplicates) 
{ 
    sb.AppendLine(String.Format("{0} have been assigned the same Number {1} for Company #{2}", 
           String.Join(" and ", duplicate), duplicate.Key.Number, 
           duplicate.Key.CompanyId)); 
} 
var message = sb.ToString(); 

現在檢查的消息是空的知道你是否有重複的,而不是你的任何()語句。

+0

謝謝查爾斯。很好地工作。仍在消化它。 – Andez 2014-09-02 19:54:56

1

我發現使用查詢語法而不是流利的語法來正確編寫LINQ查詢是很容易的。下面是一個查詢,會得到你想要的字符串:

from p in Persons 
group p by new { p.Number, p.CompanyId } into g 
where g.Count() > 1 
select string.Format(
    "{0} have been assigned the same number #{1} for company {2}", 
    string.Join(" and ", g.Select (x => x.Name)), 
    g.Key.Number, 
    g.Key.CompanyId); 

請注意查詢將不作爲LINQ到SQL /實體查詢工作,它只會針對在內存中的數據。

+0

感謝您的信息史蒂夫。我正在使用內存檢查運氣,因爲數據已經加載到我的EF ObjectStateManager,我基本上這樣做。仍然讓我有些習慣 – Andez 2014-09-02 19:54:08