C#的区别是行不通的。我做错了什么?

时间:2019-07-14 15:10:58

标签: c# linq entity-framework-core

我正在开发一个asp.net核心应用程序。
我有一个用于获取属性值的代码。

var properties = _context.Properties.Select(p => new {
    p.Name,
    Values = p.Values.Distinct()
}).Distinct();

但是Distinct()不起作用。我在做什么错了?

1 个答案:

答案 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。

但是真正的问题是,为什么首先要获得重复的属性?如果这样做,您想对重复值进行什么处理?它们将包含相同的值还是不同的值?我的实现只采用第一个属性及其值,而忽略重复项的值。相反,您可能想按名称分组并合并值。但这从您的问题中还不清楚。

相关问题