如何根据某些列在 entity/linq 中使用 Distinct(删除重复值)

How to use Distinct in entity/linq based on certain columns (Remove duplicated values)

我想从列“1)LabelName, 2)OpenLabelStandard, 3)Type 中删除重复的值。 问题是我的 table 有四列。除了前面的三个专栏,我还有一个名为 4)'Distance' 的专栏。它不是数据库中的字段。我使用视图模型中的一些计算将它添加到我的 table 中。每行的距离列都是可变的,所以当我使用 Distinct() 时,由于距离列,它不起作用。

例如, 目前我喜欢下面这个table。

LabelName    OpenLabelStandard  Type    Distance

 A1               A2             A3        30
 A1               A2             A3        50
 A1               A2             A3        100
 B1               B2             B3        15
 B1               B2             B3        60

我需要这样的结果

LabelName    OpenLabelStandard  Type    Distance

 A1               A2             A3        30
 B1               B2             B3        15

这是我在控制器中的 select。

    var listdata = (from c in _context.OpenLabelTag  select c )
                .Select(x=> new {x.LabelName,x.OpenLabelStandard,x.Type, Distance = x.Coordinates.Distance(searchArea),x.Coordinates})
  
                   .OrderBy(s=>s.Coordinates.Distance(searchArea))
                   .Where(x=>x.Coordinates.IsWithinDistance(searchArea,InputRadius) && x.OpenLabelStandard !=null)
                   .Take(10).ToList().Distinct() 
                      ;

你知道我该如何解决吗?

您不能将 distinct 应用到属性的一个子集而仍然保留其余属性,因为不同的“组”值。其他未包含在不同结果中的属性不能成为结果的一部分,因为它们可能具有多个不同的值(如您的距离示例)。

正如 HoneyBadger 所建议的,您可以使用 GroupBy() 模拟不同的对象,然后 select 所有 .Key 属性并计算其余属性的聚合函数:

var listdata = (from c in _context.OpenLabelTag select c)
    .Select(x => new { x.LabelName, x.OpenLabelStandard, x.Type, Distance = x.Coordinates.Distance(searchArea), x.Coordinates })
    .Where(x => x.Coordinates.IsWithinDistance(searchArea, InputRadius) && x.OpenLabelStandard != null)
    .GroupBy(x => new { x.LabelName, x.OpenLabelStandard, x.Type })
    .Select(gr => new
    {
        gr.Key.LabelName,
        gr.Key.OpenLabelStandard,
        gr.Key.Type,
        MinDistance = gr.Min(x => x.Distance)
    })
    .OrderBy(s => s.MinDistance)
    .Take(10).ToList();

请注意,我删除了Distinct()并将OrderBy()移到了分组操作之后。