Использование .Distinct () в определенных строках - PullRequest
1 голос
/ 19 марта 2012

У меня есть запрос Linq, который возвращает все данные, хранящиеся в таблице, на основе предложения where в виде списка:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id).ToList();

Это возвращает 23 элемента, но некоторые из этих элементов имеют некоторые столбцы, которыесодержит дубликаты данных, я назову их ColumnA, ColumnB и ColumnD.Я пробовал:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id)
                .Distinct().ToList();

Но это просто возвращает те же 23 строки.Я хотел бы, чтобы я мог указать столбцы, которые я хочу иметь разные значения, например:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id)
                .Distinct(x=> new { x.ColumnA, x.ColumnB, x.ColumnD }).ToList();

Возможно ли это, или я должен искать новый способ сделать это?

Ответы [ 3 ]

7 голосов
/ 19 марта 2012

Попробуйте объединить GroupBy и First:

List<Catalogue> data = context.Catalogue
    .Where(x => x.ManID == id)
    .GroupBy(x => new { x.ColumnA, x.ColumnB, x.ColumnD })
    .Select(g => g.First())
    .ToList();
2 голосов
/ 19 марта 2012

Это зависит от контекста. Если это что-то вроде LINQ to SQL, я бы использовал GroupBy:

List<Catalogue> data = context.Catalogue
                              .Where(x=>x.ManID == id)
                              .GroupBy(x=> new { x.ColumnA, 
                                                 x.ColumnB, 
                                                 x.ColumnD })
                              .Select(g => g.First())
                              .ToList();

(РЕДАКТИРОВАТЬ: обратите внимание, что использование First на самом деле должно быть здесь хорошо - вам не нужно использовать FirstOrDefault(), так как каждая группа должна иметь хотя бы одну запись, чтобы даже существовать. )

В LINQ to Objects я бы использовал MoreLINQ и метод DistinctBy:

List<Catalogue> data = context.Catalogue
                              .Where(x=>x.ManID == id)
                              .DistinctBy(x=> new { x.ColumnA, 
                                                    x.ColumnB, 
                                                    x.ColumnD })
                              .ToList();
0 голосов
/ 19 марта 2012

Я бы создал IEqualityComparer для 3-х свойств, которые можно использовать с Distinct().

IEqualityComparer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...