2013-09-23 147 views
5

我想創建一個datagrid,其中包含具有相同名稱的所有記錄。使用實體框架查找SQL表中的所有重複記錄

我有這個表:

Shop 
ID name   adress   city 
----------------------------------------- 
1 name1   adress 1   city1 
2 name 2  adress2   city2 
3 name 2   
4 name 2       city2 
5 name 3   
6 name 4  adress4   city4 
7 name 4  adress4   city4 

和我的DataGrid中必須包含:

2 name 2  adress2   city2 
3 name 2   
4 name 2       city2 
6 name 4  adress4   city4 
7 name 4  adress4   city4 

,但我不知道如何來創建此查詢

回答

12

如果喲你使用實體框架我假設你也使用LINQ。

在這種情況下,試試這樣:

var duplicates = Shop.GroupBy(i => i.Name) 
        .Where(x => x.Count() > 1) 
        .Select(val => val.Key); 

foreach(var item in duplicates) 
{ 
    //process 
} 

在一個簡單的例子輸出應該是這樣的: Linqpad example

//編輯:

如果你想

按多列分組,您可以使用以下語法:

var query = (from sh in Shop 
    group sh by new {sh.Name, sh.Address, sh.City} into grp 
    select new 
    { 
     name = grp.Key.Name, 
     address = grp.Key.Address, 
     city = grp.Key.City 
    }).ToList() 
     .GroupBy(q => q.name) 
     .Where (q => q.Count() >1) 
     .Dump(); 

這將導致如下:

second result

// EDIT2: 有時我很愚蠢的邊緣。 繼KISS原則:

var query = Shop.GroupBy (s => s.Name).Where (s => s.Count() > 1).Dump(); 
+0

如果我這樣做,我只有一行復制記錄。但是我想要觀看所有我的重複記錄以選擇我想要刪除 –

+0

第一個查詢組的唯一名稱併爲您提供所有重複的記錄,如我的「圖片示例」所示。如果您可以提供我們一些代碼,也許我們可以找到一個錯誤。 – Marco

+0

沒有錯誤。這不是我想要的。如果你讀了我的例子,你可以看到我想要結果中重複行的細節。在你的例子中,我會:{3,3,4,4,6,6,7,7 ...} –

2

試試這個方法:

select name, adress, city 
from tab 
where name in (select name 
       from tab 
       group by name 
       having count(name) >1) 
1
var groupedByName = from shop in Shops 
        group shop by new shop.Name into grp 
        where grp.Count() > 1 
        select grp 

應該做的工作。結果是一個具有按名稱分組的一組值(商店)的組合,其中組的密鑰是商店的名稱屬性。

對不起,但它被放置在評論太長。

+0

這不佔重複,你需要添加一個'where子句' – Marco

+0

你是對的我忘了where子句,謝謝Serv – ilmatte