2010-08-19 47 views
89

我有一个这样的名单:如何使用LINQ做SELECT UNIQUE?

Red 
Red 
Brown 
Yellow 
Green 
Green 
Brown 
Red 
Orange 

我试图做一个选择唯一使用LINQ,即我想

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

我不断收到一条消息:

类型参数不能从使用推断。尝试明确指定类型参数。

回答

148

鲜明的()会搞乱排序,所以你必须要经过的分拣。

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

谢谢,这是正确的答案。有人可以解释.OrderBy()参数中的内容。你有名字=>名字。这个名字来自数据库中的列名吗?因为我们有'dbo.Color.Name'然后只是'name => name'这暗示我不是列名?奇怪它也正确排序,如果我只是将其更改为'.OrderBy(a => a)' – baron 2010-08-19 23:29:22

+3

变量的名称是不相关的。它只是{传入函数的对象} => {用于排序的对象}。由于我们已经完成了Select,因此集合中唯一被排序的是名称。 – 2010-08-20 11:35:53

+0

谢谢@JamesCurran,你的解决方案对我非常有帮助。 – Ron 2013-04-04 17:11:14

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

+1,但我建议你使用一个代码块为您的代码 – 2010-08-19 06:37:56

10

使用查询理解语法,你可以实现排序依据如下:

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

嗯......未达成字母排序 - 由于某种原因......我切换升序和降序,得到了相同的结果。是否有明显的说法影响它?可能需要在此之后订购? – baron 2010-08-19 07:06:20

+0

可能尝试 变种uniqueColors从结果=在(从database.MainTable DBO其中dbo.Property 选择dbo.Color.Name).Distinct() 的OrderBy结果升序; – cordialgerm 2010-08-19 07:17:11