Як я можу зробити 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 ("назва стовпця"), тобто в алфавітному порядку за назвою кольору, тобто властивість 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
Ім'я змінної не має значення. Це просто {об'єкт переданий у функцію} => {об'єкт, що використовується для сортування}. Оскільки ми вже зробили Select, єдине, що сортується в колекції - це імена.
Джеймс Керран,

Дякую @JamesCurran, ваше рішення мені так допомогло.
Рон,

Здається, було б непогано, якби був OrderedBy () для впорядкування всього об’єкта / запису. Метод розширення все одно буде викликати делегата без причини.
NetMage

@NetMage - уточніть, що ви маєте на увазі під "цілим об'єктом / записом". Кожне поле? У якому порядку? Включаючи первинний ключ?
Джеймс Керран,

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

10

Використовуючи синтаксис розуміння запитів, ви можете досягти порядку таким чином:

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

Хм ... це не досягло алфавітного сортування - з якоїсь причини ... Я перемикався по зростанню та спаду і отримував однаковий результат. Чи чітке твердження впливає на це? може, це потрібно замовити після цього?
барон

Можна спробувати var uniqueColors = з результату в (з dbo в базі даних.MainTable, де dbo.Property виберіть dbo.Color.Name) .Distinct () за результатом зростання;
cordialgerm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.