Linq中的区别仅基于表的一个字段

时间:2013-01-14 15:07:22

标签: c# sql linq

我正在尝试在Linq中使用.distinct来获取基于表的一个字段的结果(因此不需要表中的整个重复记录)。

我知道使用distinct来编写基本查询:

var query = (from r in table1
orderby r.Text
select r).distinct();

但我需要r.text不重复的结果。

9 个答案:

答案 0 :(得分:246)

试试这个:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

这会将表格按Text分组,并使用每个组中的第一行,从而产生Text不同的行。

答案 1 :(得分:17)

MoreLinq有一个DistinctBy方法可以使用:

它允许你这样做:

var results = table1.DistictBy(row => row.Text);

方法的实现(缺少参数验证)如下:

private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
    HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
    foreach (TSource element in source)
    {
        if (knownKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

答案 2 :(得分:11)

  

但我需要r.text不重复的结果

听起来好像你想要这个:

table1.GroupBy(x => x.Text)
      .Where(g => g.Count() == 1)
      .Select(g => g.First());

这将选择Text唯一的行。

答案 3 :(得分:3)

关于这个主题有很多讨论。

您可以找到其中一个here

最受欢迎的建议之一是使用lambda表达式作为@Servy指出的参数的Distinct方法。

C#的首席架构师Anders Hejlsberg提出了解决方案here。还解释了为什么框架设计团队决定不添加带有lambda的Distinct方法的重载。

答案 4 :(得分:3)

Daniel Hilgarth上面的回答会导致System.NotSupported异常与实体框架。使用实体框架,必须是:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

答案 5 :(得分:2)

根据我的发现,您的查询大多是正确的。只需更改&#34;选择r&#34;到&#34;选择r.Text&#34;是所有,这应该解决问题。这就是MSDN记录它应该如何工作的方式。

例如:

    var query = (from r in table1 orderby r.Text select r.Text).distinct();

答案 6 :(得分:1)

data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });

答案 7 :(得分:-2)

试试这段代码:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

答案 8 :(得分:-4)

您可以尝试:table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();