在Linq中,仅基于表的一个字段

我正在尝试在Linq中使用.distinct来获得基于表的一个字段的结果(所以不需要从表中整个重复的logging)。

我知道使用不同的基本查询,如下所示:

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

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

尝试这个:

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

这将按照Text对表进行分组,并使用每个组的第一行,从而生成Text不同的行。

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

它可以让你做到:

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

该方法的实现(缺less参数validation)如下所示:

 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; } } } 

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

听起来,如果你想这样做:

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

这将selectText是唯一的行。

从我发现,你的查询是大多正确的。 只需将“select r”改为“select r.Text”就可以解决问题。 这是MSDN如何logging它应该如何工作。

例如:

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

Daniel Hilgarth的上面的答案导致System.NotSupportedexception与entity framework。 使用entity framework,它必须是:

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

围绕这个话题有很多的讨论。

你可以在这里find其中的一个:

其中一个最受欢迎的build议是以@Servy指出的将lambdaexpression式作为参数的Distinct方法。

C#的总devise师Anders Hejlsberg在这里提出了解决scheme。 还解释了为什么框架devise团队决定不添加一个需要lambda的Distinct方法的重载。

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

试试这个代码:

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

你可以试试这个: table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();