我在linq中使用groupby运算符时遇到问题。我正在使用.Net Core EF,所以我不确定它是否有错误,或者我是否做错了。我试图在包含几个记录的表上执行分组。我的分组键是一个非匿名实体,它通过向下导航数据库结构获取其值。
在下面的示例中,我感兴趣的是按照TypeId
和OtherId
属性给出的值对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
考虑到数据,我希望两组具有以下键和值
但是我没有得到这个。我改为使用键和值获得三组:
似乎GroupBy操作只能对具有后续id的记录进行分组。为什么会这样? 问候 路易斯。
编辑:使用匿名类型在正确的群组中执行分组结果,这可能是我定义Grouper类的方式吗?