如何使用 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 lambda 扩展方法执行带有 where 子句的左外连接