2013-09-23 8 views
5

Я хочу создать datagrid, который содержит все записи с тем же именем.Найти все повторяющиеся записи в таблице SQL с Entity Framework

У меня есть эта таблица:

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

Если yo u использовать Entity Framework Предполагаю, что вы используете 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

// EDIT:

если вы хотите Вы можете использовать этот синтаксис:

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 

должны делать свою работу. Результатом является группировка с набором значений (магазины), сгруппированными по имени, где ключом группы является свойство Name Shop.

Извините, но слишком поздно было помещено в комментарии.

+0

Это не учет дубликатов, вам нужно добавить 'where clause' – Marco

+0

, вы правы, я забыл, где предложение, спасибо Serv – ilmatte

Смежные вопросы