2013-09-23 39 views
5

Tôi muốn tạo một DataGrid chứa tất cả các bản ghi có cùng tên đó.Tìm tất cả các bản ghi trùng lặp trong bảng SQL với Entity Framework

Tôi có bảng này:

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 

và DataGrid của tôi phải chứa:

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

nhưng tôi không có ý tưởng làm thế nào để tạo truy vấn này

Trả lời

12

Nếu yo u sử dụng Entity Framework Tôi giả sử bạn sử dụng LINQ là tốt.

Trong trường hợp này, hãy thử cách này:

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

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

Trong một ví dụ đơn giản đầu ra sẽ trông như thế này: Linqpad example

// EDIT:

nếu bạn muốn để nhóm theo nhiều cột, bạn có thể sử dụng cú pháp này:

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(); 

này sẽ cho kết quả như sau:

second result

// EDIT2: đôi khi tôi biên giới ngu ngốc. Sau khi KISS-nguyên tắc:

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

Nếu tôi làm như vậy, tôi chỉ có một dòng bằng cách sao chép các bản ghi. Nhưng tôi muốn xem tất cả các bản ghi trùng lặp của tôi để chọn các bản ghi mà tôi muốn xóa –

+0

nhóm truy vấn đầu tiên chỉ theo tên và cung cấp cho bạn TẤT CẢ các bản sao, như được hiển thị trong "ví dụ hình ảnh" của tôi. Nếu bạn có thể cung cấp cho chúng tôi một số mã, có thể chúng tôi có thể tìm thấy lỗi. – Marco

+0

Không có lỗi. nó không chỉ là những gì tôi muốn. Nếu bạn đọc exemple của tôi, bạn có thể thấy rằng tôi muốn các chi tiết của các dòng trùng lặp trong kết quả của tôi. Trong ví dụ của bạn, tôi sẽ: {3,3,4,4,6,6,7,7 ...} –

2

Hãy thử cách này:

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 

nên làm việc. Kết quả là một nhóm với một tập hợp các giá trị (cửa hàng) được nhóm theo Tên, trong đó Khóa của nhóm là thuộc tính Tên của Cửa hàng.

Xin lỗi nhưng đã quá lâu để được đưa vào nhận xét.

+0

Điều này không tính đến các bản sao, bạn cần phải thêm một mệnh đề 'where' – Marco

+0

bạn đúng tôi đã quên mệnh đề where, cảm ơn bạn Serv – ilmatte

Các vấn đề liên quan