【问题标题】:How can I do SELECT UNIQUE with LINQ?如何使用 LINQ 执行 SELECT UNIQUE?
【发布时间】:2011-03-31 22:55:49
【问题描述】:

我有一个这样的列表:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

我正在尝试使用 LINQ 执行 SELECT UNIQUE,即我想要

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( "column name" ),即按颜色名称的字母顺序,所以命名属性?

我不断收到一条消息:

类型参数不能从用法中推断出来。尝试明确指定类型参数。

【问题讨论】:

    标签: sql visual-studio linq select unique


    【解决方案1】:

    Distinct() 会打乱排序,所以你必须在那之后进行排序。

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

    【讨论】:

    • 谢谢,这是正确的答案。有人可以解释 .OrderBy() 参数中的内容。你有名字=>名字。该名称是否来自数据库中的列名?因为我们有dbo.Color.Name 然后只有name=>name 这暗示我这不是列名?奇怪的是,如果我将其更改为 .OrderBy(a=>a),它也会正确排序
    • 变量名无关。它只是 {object 传入函数} => {object 用于排序}。由于我们已经完成了 Select,所以集合中唯一被排序的是名称。
    • 感谢@JamesCurran,您的解决方案对我帮助很大。
    • 如果有一个 OrderedBy() 用于按整个对象/记录排序似乎会很好。扩展方法仍然会无缘无故地调用委托。
    • @NetMage - 澄清你的意思是“整个对象/记录”。每个领域?以什么顺序?包括主键?
    【解决方案2】:
    var uniqueColors = (from dbo in database.MainTable 
                        where dbo.Property == true
                        select dbo.Color.Name).Distinct();
    

    【讨论】:

      【解决方案3】:

      使用查询理解语法,您可以按如下方式实现 orderby:

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

      【讨论】:

      • 嗯...没有实现字母排序-出于某种原因...我切换了升序和降序并得到了相同的结果。独特的陈述是否影响它?也许之后需要orderby?
      • 可以尝试 var uniqueColors = from result in (from dbo in database.MainTable where dbo.Property select dbo.Color.Name).Distinct() orderby 结果升序;
      【解决方案4】:
      var unique = (from n in test group n by n into g where g.Count()==1 select g.Key.ToString());
      

      【讨论】:

      • 不知道哪里错了,但如果你有一个列表,它就可以了。
      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多