我正在开发一个asp.net核心应用程序。
我有一个用于获取属性值的代码。
var properties = _context.Properties.Select(p => new {
p.Name,
Values = p.Values.Distinct()
}).Distinct();
但是Distinct()不起作用。我在做什么错了?
答案 0 :(得分:0)
问题是第二个Distinct
不知道如何比较项目。也许您的意思是按名称区分,而是按实例区分。
创建一个命名类型(即Property
),而不是创建一个匿名类型。然后为此类型声明IEqualityComparer<T>
:
class PropertyNameComparer : IEqualityComparer<Property>
{
public bool Equals(Property x, Property y) => x.Name.Equals(y.Name);
public int GetHashCode(Property p) => p.Name.GetHashCode();
}
(为简单起见,我在这里不处理null。)
var properties = _context.Properties.Select(p => new Property {
Name = p.Name,
Values = p.Values.Distinct()
})
.AsEnumerable()
.Distinct(new PropertyNameComparer());
请注意.AsEnumerable()
将查询与第二个Distinct
分开以使其成为LINQ-to-Objects,因为EF无法将IEqualityComparer<T>
转换为SQL。
但是真正的问题是,为什么首先要获得重复的属性?如果这样做,您想对重复值进行什么处理?它们将包含相同的值还是不同的值?我的实现只采用第一个属性及其值,而忽略重复项的值。相反,您可能想按名称分组并合并值。但这从您的问题中还不清楚。