Я пытаюсь использовать .distinct в Linq, чтобы получить результат на основе одного поля таблицы (поэтому не требуется целые дублированные записи из таблицы).
Я знаю, как писать базовый запрос, используя следующие:
var query = (from r in table1
orderby r.Text
select r).distinct();
но мне нужны результаты, которые r.text
не дублируются.
Ответы:
Попробуй это:
Это сгруппирует таблицу по
Text
и использует первую строку из каждой группы, в результате чего будут строки, в которыхText
есть разные.источник
table1.GroupBy(x => new { x.Text, x.Property2, x.Property3 }).Select(x => x.First());
GroupBy
не создает пустых групп, см. мой предыдущий комментарий. Скорее всего, ваш код содержит больше, чем вы здесь видите. Может быть, у вас тожеWhere
есть условие дляFirst
.MoreLinq имеет метод DistinctBy, который вы можете использовать:
Это позволит вам делать:
Реализация метода (за исключением проверки аргументов) следующая:
источник
GroupBy
как он тоже нужен. Оба метода будут использовать значение по умолчанию,EqualityComparer
если оно не указано.Похоже, вы этого хотите:
Это выберет строки, в которых
Text
является уникальным.источник
Ответ Дэниела Хилгарта выше приводит к
System.NotSupported
исключению с Entity-Framework . С Entity-Framework это должно быть:источник
По этой теме ведется много дискуссий.
Вы можете найти один из них здесь :
Одним из самых популярных предложений был метод Distinct, принимающий лямбда-выражение в качестве параметра, как указал @Servy.
Главный архитектор C # Андерс Хейлсберг предложил здесь решение . Также объясняется, почему команда разработчиков фреймворка решила не добавлять перегрузку метода Distinct, который принимает лямбду.
источник
Судя по тому, что я нашел, ваш запрос в основном правильный. Просто измените «select r» на «select r.Text» и все, и это должно решить проблему. Вот как MSDN задокументировала, как это должно работать.
Пример:
источник
источник
попробуйте этот код:
источник
Вы можете попробовать это:
table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();
источник