C# GroupBy linq仅对相邻记录起作用
我在linq中使用groupby运算符时遇到问题。我使用的是.Net Core EF,所以我不确定它是否有bug,或者我是否做错了什么。我正在尝试对包含多条记录的表进行分组。我的分组键是一个非匿名实体,它通过在db结构中向下导航一个级别来获取其值。 在下面的示例中,我感兴趣的是根据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
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
考虑到这些数据,我希望有两组具有以下键和值
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类的方式吗?在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()
你发布了很多信息,但我建议你做一个真实的例子,人们可以直接复制和粘贴来体验你的问题,不要叫我“路易斯”