在 Linq 中仅基于表的一个字段进行区分

我正在尝试使用。在 Linq 可以根据表中的一个字段得到结果(因此不需要表中的整个重复记录)。

我知道如何写基本的查询语句:

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

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

202594 次浏览

试试这个:

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

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

但我需要没有复制 r.text 的结果

听起来好像你想要这个:

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

这将选择 Text唯一的行。

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

它将允许你做:

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

更新

从现在开始。NET 6中引入了一个新的 区别运算符。然而,尽管这种方法对 Linq to Objects 很有效,但是对 Linq to Entities 似乎没有效果。我在 EF Core 6.0.6和 SQL 服务器上进行了测试。

一般来说,LINQ 操作符成对出现,以支持这两种情况。例如,可枚举,选择涵盖 Linq 到对象,可查询,请选择涵盖 Linq 到实体。

有趣的是,DistinctBy也有这两种风格,但 EF Core 的 SQL Server 提供程序不支持将其转换为 SQL。在我看来,原因是它将导致一个缓慢的查询。

原始答案

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

你可以找到其中之一 给你:

最流行的建议之一就是像@Servy 所指出的那样,将 lambda 表达式作为参数的 District 方法。

作为 c # 的首席架构师,安德斯·海尔斯伯格提出了解决方案 给你。同时也解释了为什么框架设计团队决定不添加一个重载的、以 lambda 为参数的 District 方法。

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

根据我的发现,你的问题基本上是正确的。只要将“选择 r”改为“选择 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 });

试试这个代码:

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

明显返回你单列,如果这是你的情况然后! !

CountryData.Select(x=>x.COUNTRY_NAME).Distinct()

否则,如果您需要多个列,并且这些列之间有一个明显的区别。您需要先选择 集体服装,然后从组中选择第一个项目。 (在这种情况下,不会返回具有不同值的组中的其余项)

CountryData.GroupBy(a=>a.COUNTRY_NAME).Select(a=>a.First());