使用Linq的数据库表中的唯一字符串列表?

时间:2009-05-20 11:07:31

标签: c# sql-server linq

我有一个“Tickets”表,其中有一些结构(删除了不必要的列)

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

我已将此表格映射到“Ticket”类。所以我可以得到这样的所有记录:

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

现在我需要获取表中唯一窗口名称的列表。对于上表,列表看起来像:

  • 因特网
  • 电话
  • 传真

无论如何创建此列表而不获取所有记录并迭代它们?

我使用的是SQL Server 2008快速版。

编辑: 谢谢你的答案,它解决了上述问题。只是贪婪,但有没有办法得到每个窗口的总计数。例如:

  • 互联网= 15
  • 电话= 25
  • 传真= 20

5 个答案:

答案 0 :(得分:10)

怎么样:

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查询以检查这一点。

答案 1 :(得分:3)

 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)
 };  

答案 2 :(得分:1)

比尔瓦格纳的

Linq Samples Part 11应该会帮助你。只需在Linq结果上调用Distinct()函数即可。就这么简单。

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

<强> [编辑]

将出现的数字see this example作为提示。

        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

答案 3 :(得分:1)

将在商店内评估查询。

var windows = db.Tickets.Select(ticket => ticket.Window).Distinct();

答案 4 :(得分:0)

您可以使用.Distinct()运算符 - 它将对数据库进行SELECT DISTINCT,准确提供您所要求的内容。