如何根据某些列在 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()
移到了分组操作之后。
我想从列“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()
移到了分组操作之后。