Как я могу сделать SELECT UNIQUE с LINQ?

96

У меня есть такой список:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

Я пытаюсь выполнить SELECT UNIQUE с LINQ, т.е. я хочу

Red
Brown
Yellow
Green
Orange

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name;

Затем я изменил это на

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name.Distinct();

безуспешно. Первый selectполучает ВСЕ цвета, так как мне изменить его, чтобы получить только уникальные значения?

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

Как мне отредактировать его, чтобы я мог иметь, .OrderBy( "column name" )например, в алфавитном порядке по названию цвета, то есть свойство name?

Я получаю сообщение:

Аргументы типа не могут быть выведены из использования. Попробуйте явно указать аргументы типа.

барон
источник

Ответы:

159

Это Distinct()испортит порядок, поэтому вам придется после этого сортировку.

var uniqueColors = 
               (from dbo in database.MainTable 
                 where dbo.Property == true 
                 select dbo.Color.Name).Distinct().OrderBy(name=>name);
Джеймс Карран
источник
3
Спасибо, это правильный ответ. Может кто-нибудь объяснить, что входит в параметры .OrderBy (). У вас есть имя => имя. Это имя происходит от имени столбца в БД? Потому что dbo.Color.Nameтогда у нас есть только name=>nameкакие подсказки мне это не имя столбца? Странно, это тоже правильно, если я просто поменяю это на.OrderBy(a=>a)
барон
3
Имя переменной не имеет значения. Это просто {объект, переданный в функцию} => {объект, используемый для сортировки}. Поскольку мы уже выполнили выборку, единственное, что сортируется в коллекции, - это имена.
Джеймс Карран,
Спасибо @JamesCurran, ваше решение мне очень помогло.
Рон
Похоже, было бы неплохо, если бы был OrderedBy () для упорядочивания по всему объекту / записи. Метод расширения по-прежнему будет вызывать делегат без причины.
NetMage
@NetMage - поясните, что вы имеете в виду под "объектом / записью целиком". Каждое поле? В каком порядке? Включая первичный ключ?
Джеймс Карран,
20
var uniqueColors = (from dbo in database.MainTable 
                    where dbo.Property == true
                    select dbo.Color.Name).Distinct();
Jwendl
источник
10

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

var uniqueColors = (from dbo in database.MainTable
                    where dbo.Property
                    orderby dbo.Color.Name ascending
                    select dbo.Color.Name).Distinct();
сердечный микроб
источник
Хм ... алфавитной сортировки не получилось - по какой-то причине ... Переключил по возрастанию и по убыванию и получил тот же результат. На это влияет отчетливое заявление? может быть, это нужно заказать после этого?
барон
Можно попробовать var uniqueColors = from result in (from dbo in database.MainTable where dbo.Property select dbo.Color.Name) .Distinct () orderby result ascending;
cordialgerm