Список уникальных строк в таблице базы данных с использованием Linq? - PullRequest
3 голосов
/ 20 мая 2009

У меня есть таблица «Билеты» с несколько следующей структурой (удалены ненужные столбцы)

int | string   | int   |
ID  | Window   | Count |
------------------------
0   | Internet | 10    |
1   | Phone    | 20    |
2   | Fax      | 15    |
3   | Fax      | 10    |
4   | Internet | 5     |
.   | .        | .     |
.   | .        | .     |

И я сопоставил эту таблицу с классом «Билет». Таким образом, я могу получить все записи, как это:

var tickets = from t in db.Tickets
              select t;

Теперь мне нужно получить список уникальных имен окон в таблице. Для приведенной выше таблицы список будет выглядеть примерно так:

  • Интернет
  • Телефон
  • Факс

Есть ли способ создать этот список, не выбирая все записи и не перебирая их?

Я использую SQL Server 2008 Express Edition.

EDIT: Спасибо за ответы, ребята, это решило вышеуказанную проблему. Просто быть жадным, но есть ли способ и получить общее количество для каждого окна. Например:

  • Интернет = 15
  • Телефон = 25
  • Факс = 20

Ответы [ 5 ]

10 голосов
/ 20 мая 2009

Как насчет:

var tickets = db.Tickets.Select(t => t.Window).Distinct();

Я предпочитаю использовать выражения запросов только тогда, когда я делаю более одной операции, но если они вам нравятся, эквивалентен:

var tickets = (from t in db.Tickets
               select t.Window).Distinct(); 

Чтобы получить количество, вам нужно сгруппировать:

var tickets = from t in db.Tickets
              group t by t.Window into grouped
              select new { Window=grouped.Key, 
                           Total=grouped.Sum(x => x.Count) };

foreach (var entry in tickets)
{
    Console.WriteLine("{0}: {1}", entry.Window, entry.Total);
}

Обратите внимание, что все это должно закончиться выполнением на стороне базы данных - проверьте SQL-запрос, чтобы проверить это.

3 голосов
/ 20 мая 2009
 var query2 = from ticket in db.tickets 

 group window by ticket.Window into result
 select new
 {
     Name = result.Window,
     Sum = result.Sum(i => i.Count)
 };  
1 голос
/ 20 мая 2009

Запрос будет оценен внутри магазина.

var windows = db.Tickets.Select(ticket => ticket.Window).Distinct();
1 голос
/ 20 мая 2009

Образцы Linq Part 11 Билла Вагнера должны помочь вам. Просто вызовите функцию Distinct() для вашего результата Linq. Это так просто.

var tickets = (from t in db.Tickets
               select t).Distinct();

[EDIT]

Принимая во внимание числа вхождений, см. Этот пример в качестве подсказки.

        int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 5 };

        var numberGroups =
            from n in numbers
            group n by 5 into g
            select g;

        g.Count(); // occurences
0 голосов
/ 20 мая 2009

Вы можете использовать оператор .Distinct () - он сделает SELECT DISTINCT для базы данных, давая именно то, что вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...