Отличается в Linq на основе только одного поля таблицы

Я пытаюсь использовать .distinct в Linq, чтобы получить результат, основанный на одном поле таблицы (так что не нужно целых дублированных записей из таблицы).

Я знаю, как писать базовый запрос, используя следующие выражения:

var query = (from r in table1
orderby r.Text
select r).distinct();

но мне нужны результаты, где r.text не дублируется.

Ответ 1

Попробуйте следующее:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

Это будет группировать таблицу с помощью Text и использовать первую строку из каждой группы, в результате чего строки, где Text являются различными.

Ответ 2

В MoreLinq есть метод DistinctBy, который вы можете использовать:

Это позволит вам сделать:

var results = table1.DistictBy(row => row.Text);

Реализация метода (без проверки аргумента) выглядит следующим образом:

private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
    HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
    foreach (TSource element in source)
    {
        if (knownKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

Ответ 3

но мне нужны результаты, где r.text не дублируется

Звучит так, как будто вы этого хотите:

table1.GroupBy(x => x.Text)
      .Where(g => g.Count() == 1)
      .Select(g => g.First());

Это приведет к выбору строк, где Text уникален.

Ответ 4

Из того, что я нашел, ваш запрос в основном правильный. Просто измените "select r" на "select r.Text" - это все, и это должно решить проблему. Вот как MSDN документировала, как он должен работать.

Пример:

    var query = (from r in table1 orderby r.Text select r.Text).distinct();

Ответ 5

Даниэль Хильгарт ответ выше приводит к исключению System.NotSupported с Entity-Framework. С Entity-Framework это должно быть:

table1.GroupBy(x = > x.Text). Выберите (x = > x.FirstOrDefault());

Ответ 6

В этой теме много дискуссий.

Вы можете найти один из них здесь:

Одним из самых популярных предложений был метод Distinct, в котором выражение лямбда было указано как параметр, который указал @Servy.

Главный архитектор С# Андерс Хейлсберг предложил решение здесь. Также объяснялось, почему команда дизайна каркаса решила не добавлять перегрузку метода Distinct, который принимает лямбда.

Ответ 7

data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });

Ответ 8

попробуйте этот код:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

Ответ 9

Вы можете попробовать следующее: table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();