我正在尝试在 Linq 中使用 .distinct 来获取基于表的一个字段的结果(因此不需要表中的整个重复记录)。
我知道使用 distinct 编写基本查询,如下所示:
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);
该方法的实现(缺少参数验证)如下:
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());
这将选择Text
唯一的行。
Daniel Hilgarth上面的回答导致了一个System.NotSupported
例外 With Entity-Framework。使用Entity-Framework,它必须是:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
根据我的发现,您的查询大部分是正确的。只需将“select r”更改为“select r.Text”即可,这应该可以解决问题。这就是 MSDN 记录它应该如何工作的方式。
前任:
var query = (from r in table1 orderby r.Text select r.Text).distinct();
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });
不同的返回你的单列,如果那是你的情况那么!!
CountryData.Select(x=>x.COUNTRY_NAME).Distinct()
否则,如果您需要一列不同的多列。您需要先分组,然后从组中选择第一项。 (在这种情况下,不会返回组中具有不同值的其余项目)
CountryData.GroupBy(a=>a.COUNTRY_NAME).Select(a=>a.First());
试试这个代码:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
你可以试试这个:table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();