如何使用 LINQ 执行 SELECT UNIQUE?

Posted

技术标签:

【中文标题】如何使用 LINQ 执行 SELECT UNIQUE?【英文标题】:How can I do SELECT UNIQUE with LINQ? 【发布时间】: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" ),即按颜色名称的字母顺序,所以命名属性?

我不断收到一条消息:

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

【问题讨论】:

【参考方案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());

【讨论】:

不知道哪里错了,但如果你有一个列表,它就可以了。

以上是关于如何使用 LINQ 执行 SELECT UNIQUE?的主要内容,如果未能解决你的问题,请参考以下文章

动态 Linq 查询 - 如何构建 select 子句?

如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接

如何在linq中选择All(*)到sql

LINQ操作符一:Select

如何在 LINQ to Entities 中执行 SQL“在哪里存在”?

使用 LINQ Select 和 Lambda 避免 2100 rpc 限制