2010-08-19 3 views
89

У меня есть список, как это:Как сделать SELECT UNIQUE с LINQ?

Red 
Red 
Brown 
Yellow 
Green 
Green 
Brown 
Red 
Orange 

Я пытаюсь сделать ВЫБЕРИТЕ 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 («имя столбца»), то есть в алфавитном порядке по имени цвета, так что свойство name?

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

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

ответ

148

отчетливого() собирается испортить заказ, так что вы должны будете сортировка после этого ,

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', который подсказывает мне, что это не имя столбца? Bizarre также сортирует правильно, если я просто изменяю это на. .OrderBy (a => a) ' – baron

+3

Имя переменной не имеет значения. Это просто {объект передан функции} => {объект, используемый для сортировки}. Поскольку мы уже сделали Select, единственное, что сортируется в сортировке, это имена. –

+0

Спасибо @JamesCurran, ваше решение очень помогло мне. – Ron

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

+1, но я предлагаю вам использовать блок кода для кода –

10

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

var uniqueColors = (from dbo in database.MainTable 
        where dbo.Property 
        orderby dbo.Color.Name ascending 
        select dbo.Color.Name).Distinct(); 
+0

... Хм, не достичь алфавитный рода - по какой-то причине ... я переключил восходящие и нисходящие и получил тот же результат. Является ли конкретное заявление влияющим на него? возможно, его нужно заказать после этого? – baron

+0

Может попробовать вар uniqueColors = от результата в (из DBO в database.MainTable где dbo.Property выбрать dbo.Color.Name) .distinct() OrderBy результата восходящие; – cordialgerm

Смежные вопросы