linq отчетливый и выберите новый запрос - PullRequest
8 голосов
/ 03 апреля 2012

У меня есть запрос

var QP = (from a in QProductAllInfo select new { a.Id, a.Title, a.FullTitle}).Distinct();

Результат:

  • 1 Иванов Иван
  • 1 Иванов Иван
  • 2 Петров Петр
  • 3 Сидоров Иван
  • 3 Сидоров Иван

и мне нужен результат:

  • 1 Иванов Иван
  • 2 Петров Петр
  • 3 Сидоров Иван

Ответы [ 3 ]

8 голосов
/ 03 апреля 2012

Предполагая, что разные идентификаторы всегда считаются разными, вы можете попробовать это.

Я бы, наверное, написал это в двух запросах. Таким образом, это легко отлаживать и более читабельно. Вы можете использовать MoreLinq.

DistinctBy

Скачать

var temp = from a in QProductAllInfo select new { a.Id, a.Title, a.FullTitle}.ToList();

var result = temp.DistinctBy(i => i.Id);

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

Var result = temp.GroupBy(x => x.Id).Select(y => y.First());
2 голосов
/ 03 апреля 2012

Если у вас есть дубликаты в QProductAllInfo, замена кода на это должна решить вашу проблему.

var QP = from a in QProductAllInfo.Distinct() 
         select new { a.Id, a.Title, a.FullTitle };

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

var QP = from a in QProductAllInfo
         select Tuple.Create(a.Id, a.Title, a.FullTitle);

Применение оператора Distinct к анонимным типам бесполезно, поскольку анонимные типы всегда являются ссылочными типами, которые не реализуют интерфейс IEquatable.

0 голосов
/ 03 апреля 2012

Вы можете реализовать IEqualitycomparer, который .Distinct использует, чтобы определить, существует ли элемент в списке.Вместо этого он может сравнивать атрибуты со ссылкой на тот же объект.

Но я не знаю, работает ли он с анонимными типами.

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