【问题标题】:List of unique strings in database table using Linq?使用Linq的数据库表中的唯一字符串列表?
【发布时间】:2009-05-20 11:07:31
【问题描述】:

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

整数 |字符串 |整数 | 身份证 |窗口 |计数 | ---------------------- 0 |互联网 | 10 | 1 |电话 | 20 | 2 |传真 | 15 | 3 |传真 | 10 | 4 |互联网 | 5 | . | . | . | . | . | . |

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

var ticket = 来自 db.Tickets 中的 t 选择 t;

现在我需要获取表中唯一窗口名称的列表。对于上表,列表如下所示:

  • 互联网
  • 电话
  • 传真

是否可以在不获取所有记录并对其进行迭代的情况下创建此列表?

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

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

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

【问题讨论】:

  • 如果没有更多的数据库方面的魔法(查找表、触发器等) - 数据库将需要获取整个列表才能在它们之间应用不同的。下面的答案是正确的,只是注意数据库仍然会扫描整个表/索引。
  • 数据库会,但 .NET 代码不会获取所有记录并在本地对其进行迭代,这正是我怀疑 Hemant 担心的问题。

标签: c# sql-server linq


【解决方案1】:

怎么样:

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

【讨论】:

  • 我认为第二个样本应该是t.Window?我真的是一个初学者所以不太确定......
【解决方案2】:
 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)
 };  

【讨论】:

  • 我认为您的意思是“团体票”而不是“团体窗口”。此外,“结果”范围变量不会有 Window 属性,但会有 Key 属性。
【解决方案3】:

查询将在商店内进行评估。

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

【讨论】:

    【解决方案4】:

    比尔瓦格纳的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
    

    【讨论】:

    • 我很困惑,这段代码怎么知道我们在哪个字段中寻找不同的?
    • 它返回唯一行的列表,这样所有字段的组合都是不同的。这转化为 SELECT DISTINCT 数据库机制。
    • 它正在比较结果对象。您可以通过实现 IEqualityComparer 接口来提供自定义比较器,并将比较器作为参数传递给 Distinct()。
    • 更新了后续问题的答案。
    • 后续问题与出现次数无关。这是关于计算“窗口”的不同值的行上的“计数”总和。
    【解决方案5】:

    您可以使用 .Distinct() 运算符 - 它会为数据库创建一个 SELECT DISTINCT,准确给出您的要求。

    【讨论】:

      猜你喜欢
      • 2019-09-11
      • 2017-07-27
      • 2022-11-11
      • 2012-12-03
      • 1970-01-01
      • 2021-12-11
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多