C# GroupBy linq仅对相邻记录起作用

C# GroupBy linq仅对相邻记录起作用,c#,entity-framework,linq,entity-framework-core,C#,Entity Framework,Linq,Entity Framework Core,我在linq中使用groupby运算符时遇到问题。我使用的是.Net Core EF,所以我不确定它是否有bug,或者我是否做错了什么。我正在尝试对包含多条记录的表进行分组。我的分组键是一个非匿名实体,它通过在db结构中向下导航一个级别来获取其值。 在下面的示例中,我感兴趣的是根据TypeId和OtherId属性给出的值对结果表上的记录进行分组 ResultTable - ResultId - DetailId (FK) DetailTable - DetailId - TypeId (map

我在linq中使用groupby运算符时遇到问题。我使用的是.Net Core EF,所以我不确定它是否有bug,或者我是否做错了什么。我正在尝试对包含多条记录的表进行分组。我的分组键是一个非匿名实体,它通过在db结构中向下导航一个级别来获取其值。 在下面的示例中,我感兴趣的是根据
TypeId
OtherId
属性给出的值对结果表上的记录进行分组

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 ;
}
我希望它能做到以下几点。假设我有以下记录:

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
考虑到这些数据,我希望有两组具有以下键和值

  • 第一个组具有键Grouper(类型:1,其他ID:1),值ResultId(1,2,4)
  • 第二个组具有键Grouper(类型:2,其他ID:0),值ResultId(3)
  • 然而,我不明白这一点。取而代之的是,我得到了三组密钥和值,如下所示:

    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 ;
        }
    }
    
  • 第一个组具有键Grouper(类型:1,其他ID:1),值ResultId(1,2,4)
  • 第二个组具有键Grouper(类型:2,其他ID:0),值ResultId(3)
  • 第三个组具有键Grouper(类型:1,其他ID:1),值ResultId(4)
  • GroupBy操作似乎只能对具有后续id的记录进行分组。为什么会这样? 问候语 路易斯


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

    在visual studio中将此设置为测试时,我注意到您正在将
    类型
    传递给您的
    Grouper
    。您对模式的描述听起来像是
    Type
    是您定义的
    enum
    ,但是
    Type
    已经存在于
    系统
    命名空间中,而且它是c中更基本的类之一,您发布的代码将抛出一个
    NotSupportedException
    ,因为
    在LINQ to Entities中只支持无参数构造函数和初始化器
    。似乎不允许对Grouper使用参数化构造函数。我怀疑你对执行查询的
    results
    做了一些事情,比如
    results.ToList()
    你发布了很多信息,但我建议你做一个真实的例子,人们可以直接复制和粘贴来体验你的问题,不要叫我“路易斯”在visual studio中将此设置为测试时,我注意到您正在将
    类型
    传递给您的
    Grouper
    。您对模式的描述听起来像是
    Type
    是您定义的
    enum
    ,但是
    Type
    已经存在于
    系统
    命名空间中,而且它是c中更基本的类之一,您发布的代码将抛出一个
    NotSupportedException
    ,因为
    在LINQ to Entities中只支持无参数构造函数和初始化器
    。似乎不允许对Grouper使用参数化构造函数。我怀疑你对执行查询的
    results
    做了一些事情,比如
    results.ToList()
    你发布了很多信息,但我建议你做一个真实的例子,人们可以直接复制和粘贴来体验你的问题,不要叫我“路易斯”