如何使用LINQ进行SELECT UNIQUE?


96

我有一个这样的清单:

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”),即按字母顺序按颜色名称,即name属性?

我不断收到消息:

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

Answers:


159

Distinct()会弄乱排序,因此之后您必须进行排序。

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

3
谢谢,这是正确的答案。有人可以解释一下.OrderBy()参数中的内容吗?您有name => name。该名称是否来自数据库中的列名称?因为dbo.Color.Name那时我们才name=>name知道这不是列名吗?如果我只是将其更改为奇怪的话,它也会正确排序.OrderBy(a=>a)
男爵

3
变量的名称无关紧要。只是{将对象传递给函数} => {用于排序的对象}。既然我们已经完成了选择,那么排序中的唯一集合就是名称。
詹姆斯·柯伦

感谢@JamesCurran,您的解决方案对我有很大帮助。
罗恩

似乎如果有一个OrderedBy()用于按整个对象/记录进行排序,那会很好。扩展方法仍然会无缘无故地调用委托。
NetMage 2016年

@NetMage-阐明您的意思是“整个对象/记录”。每个领域?以什么顺序?包括主键?
詹姆斯·柯伦

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

10

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

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

嗯...由于某种原因,没有实现字母排序-我切换了升序和降序,得到了相同的结果。独特的陈述会影响它吗?也许之后需要订购吗?
男爵

可以尝试var uniqueColors = from结果输入(来自database.MainTable中的dbo,其中dbo.Property选择dbo.Color.Name)。Distinct()按结果升序排序;
cordialgerm 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.