【发布时间】: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 类型,在方法之后它们仍然是未分组的,我只是想知道为什么会这样。
【问题讨论】:
-
这根本没有意义,如果这是一个主键,那么根据定义它是唯一的。为什么要按这个分组?