【问题标题】:C# LINQ Group By Base ClassC# LINQ 按基类分组
【发布时间】:2016-04-25 04:33:53
【问题描述】:

我构建了一个基类,它保留了所有主键,例如:

public class PrimaryKey
{       
    [Key]
    [Column(Order = 1)]
    public DateTime Date { get; set; }

    [Key]
    [Column(Order = 2)]
    public int ID1 { get; set; }

    [Key]
    [Column(Order = 3)]
    public int ID2 { get; set; }
}

还有一些从这个类派生的不同类型数据的类。

然后我想使用一种方法为这些派生类 GroupBy 主键创建列表。我现在所做的是:

private IEnumerable<IGrouping<PrimaryKey, T>> DataGroupByPrimaryKey<T>(IEnumerable<T> source) where T : PrimaryKey
    {
        return source.GroupBy(s => new PrimaryKey
        {
            Date = s.Date,
            ID1 = s.ID1,
            ID2 = s.ID2
        });
    }

但它看起来不起作用,因为在程序运行此方法后,具有相同主键集的列表仍保持未分组状态。

我尝试过类似的东西

source.GroupBy(s => new
        {
            s.Date,
            s.ID1,
            s.ID2
        });

它确实使数据分组,但由于 GroupBy 类型是匿名的,因此不适合该方法。

我原来写的方法有什么问题吗?

[已编辑并添加更多信息]

很抱歉没有清楚地描述我的问题。实际上我现在正在做的是将数据复制到不同的数据库中,并且每一行都应该通过这些键的集合是唯一的。 (那么这个集合称为主键)

在原始数据中,存在具有相同主键集的行。所以在 GroupBy 处理之后,我将对具有相同主键集的数据求和,并使其成为字典。

sourceAfterGroupBy.Select(s => new DerivedClassWithData
        {
            Date = s.Key.Date,
            ID1 = s.Key.ID1,
            ID2 = s.Key.ID2,                
            Data1 = s.Sum(p => p.Data1),
            Data2 = s.Sum(p => p.Data2)
        });

dataSum.ToDictionary(s => s.PrimaryKeyTuple);

现在唯一的问题是,如果我在 GroupBy 函数中使用匿名类型,它肯定可以通过键集对我的数据进行分组。但是如果我想使用 PrimaryKey 类型,在方法之后它们仍然是未分组的,我只是想知道为什么会这样。

【问题讨论】:

  • 这根本没有意义,如果这是一个主键,那么根据定义它是唯一的。为什么要按这个分组?

标签: c# linq group-by


【解决方案1】:

让PrimaryKey实现IEquable接口并覆盖Object.GetHashCode方法。代码如下:

public class PrimaryKey : IEquable<PrimaryKey>
{       
    // other properties
    bool Equals(PrimaryKey other)
    {
        return this.Date == other.Date && this.ID1 == other.ID1 && this.ID2 == other.ID2;
    }

    override int GetHashCode()
    {
        return this.Date.GetHashCode() ^ this.ID2.GetHashCode() ^ this.ID2.GetHashCode();
    }
}

【讨论】:

  • 嘿!这确实解决了我的问题!抱歉,我现在的声誉分数不够高,无法更改答案分数,但非常感谢您的回复。
  • @Chu-HsuanLee 无论您的代表如何,您都应该能够accept 回答您自己的问题。
  • @IvanStoev ha,谢谢。我没有意识到大声笑......这里的新手
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2013-05-16
  • 2011-01-10
相关资源
最近更新 更多