在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();