有没有办法在LINQ查询语法中使用Distinct?

时间:2011-04-19 18:30:08

标签: c# linq

有没有办法改写:

var tbl = ds.TABLES;
var q = from c in tbl
        select c.TABLE_TYPE;
string s = "";
foreach (var item in q.Distinct())
{
    s += "[" + item + "]";
}        
MessageBox.Show(s);

那么Distinct()调用是否在LINQ查询中?

6 个答案:

答案 0 :(得分:54)

语言集成查询语法中没有Distinct()方法语法。你可以做的最接近的是移动当前的电话:

var q = (from c in tbl
         select c.TABLE_TYPE).Distinct();

答案 1 :(得分:50)

LINQ中的Distinct扩展方法没有等效的查询语法。

有关原因的更多信息,请参阅http://blogs.msdn.com/b/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx

答案 2 :(得分:11)

(from c in tbl select c.TABLE_TYPE).Distinct();

答案 3 :(得分:1)

如果在select之后放置distinct,则VB具有此功能。

答案 4 :(得分:0)

您可以捕获HashSet并在select之前放置where子句:

var hs = new HashSet<char>();

from c in "abcabcd"
where hs.Add(c)
select c;

答案 5 :(得分:0)

在发现此问题并意识到不存在此问题时,在为LINQ搜索独特功能时,我的解决方法是使用GroupBy()。 明显的问题是,不重复集不包含所有数据(例如,您有三个字段,但只想区分两个字段,而最后一个字段的值丢失了,但是再一次,在t-sql中是DISTINCT的工作方式相同。

LINQ代码(因此转储):

void Main()
{
    var gt = new GenerateThings();
    var dlist = gt.list();
    dlist.Dump();

    dlist.GroupBy(x => new {x.id, x.cat}).Dump();
}

public class model
{
    public int id {get;set;}
    public int cat {get;set;}
    public int type {get;set;}
}

public class GenerateThings
{
    public List<model>list()
    {
        var dlist = new List<model>();
        dlist.Add(createNew(1, 1, 1));
        dlist.Add(createNew(1, 1, 1));
        dlist.Add(createNew(1, 2, 1));
        dlist.Add(createNew(1, 2, 1));
        dlist.Add(createNew(1, 1, 2));
        dlist.Add(createNew(1, 1, 2));
        dlist.Add(createNew(1, 1, 2));
        return dlist;
    }
    private model createNew(int id, int cat, int type){
        return new model{
            id = id,
            cat = cat,
            type = type
        };
    }
}

LINQ-dump result