GroupBy linq仅适用于相邻记录

时间:2016-09-14 17:09:11

标签: c# entity-framework linq entity-framework-core

我在linq中使用groupby运算符时遇到问题。我正在使用.Net Core EF,所以我不确定它是否有错误,或者我是否做错了。我试图在包含几个记录的表上执行分组。我的分组键是一个非匿名实体,它通过向下导航数据库结构获取其值。 在下面的示例中,我感兴趣的是按照TypeIdOtherId属性给出的值对ResultTable中存在的记录进行分组。

ResultTable
- ResultId
- DetailId (FK)

DetailTable
- DetailId
- TypeId (maps to enum, not null)
- OtherId (FK, null)

我的分组代码如下:

private IQueryable<IGrouping<Grouper, Result>> GetGroupedResults()
{
    var results = MyContext.ResultSet.Include(r => r.Detail);
    var groupedResults = results.GroupBy(r => new Grouper(r.Detail.TypeId, r.Detail.OtherId ?? 0));
    return groupedResults ;
}

我的石斑鱼实体的定义如下:

public class Grouper
{
    public Grouper(Type type, int otherId)
    {
        Type= type;
        OtherId = otherId;
    }
    public Type Type{ get; } // this is an enum
    public int OtherId  { get; }
    public override bool Equals(object obj)
    {
        var p = obj as Grouper;
        if (p == null)
        {
            return false;
        }
        return (Type == p.Type ) && (OtherId  == p.OtherId);
    }
    public override int GetHashCode()
    {
        return (int)Type ;
    }
}

我期望这样做的是以下内容。让我们说我有以下记录:

ResultTable
ResultId: 1, DetailId: 1
ResultId: 2, DetailId: 2
ResultId: 3, DetailId: 3
ResultId: 4, DetailId: 4

DetailTable
DetailId: 1, TypeId: 1, OtherId: 1
DetailId: 2, TypeId: 1, OtherId: 1
DetailId: 3, TypeId: 2, OtherId: NULL
DetailId: 4, TypeId: 1, OtherId: 1

考虑到数据,我希望两组具有以下键和值

  1. 第一组包含密钥Grouper(类型:1,OtherId:1),值ResultId(1,2,4)
  2. 带有密钥Grouper的第二组(类型:2,OtherId:0),值ResultId(3)
  3. 但是我没有得到这个。我改为使用键和值获得三组:

    1. 第一组包含密钥Grouper(类型:1,OtherId:1),值ResultId(1,2,4)
    2. 带有密钥Grouper的第二组(类型:2,OtherId:0),值ResultId(3)
    3. 第三组包含密钥Grouper(类型:1,OtherId:1),值ResultId(4)
    4. 似乎GroupBy操作只能对具有后续id的记录进行分组。为什么会这样? 问候 路易斯。

      编辑:使用匿名类型在正确的群组中执行分组结果,这可能是我定义Grouper类的方式吗?

0 个答案:

没有答案