我有以下数据模型,我需要将符合以下条件的ResponseItem
个数据模型分组:
-
First:
Group by ResponseItem.Group
-
Second:
Group by ResponseItem.SubGroup
,但只考虑最近的一个,这意味着考虑ResponseItem.CreationDate
代码:
public class ResponseItem
{
public string Group { get; set; }
public string SubGroup { get; set; }
public double Value { get; set; }
public DateTime CreationDate { get; set; }
}
public class GroupedResponseItem
{
public string Group { get; set; }
public List<ResponseItem> Items { get; set; }
}
方法是:
public List<GroupedResponseItem> GetGroupedData( IQueryable<ResponseItem> responseItems )
{
return responseItems
.OrderByDescending(i => i.CreationDate)
.GroupBy(i => i.Group)
.Select(grp => new GroupedResponseItem()
{
Group = grp.Key,
Items = grp
.GroupBy(i => new { i.SubGroup })
.Select(grp => grp.First())
.Select(i => new ResponseItem()
{
SubGroup = i.SubGroup,
CreationDate = i.CreationDate,
Value = i.Value
}).ToList()
})
.ToList();
}
但我得到了一个错误:
‘无法转换LINQ表达式’ProjectionBindingExpression:0‘.以可翻译的形式重写查询,或者通过插入对‘AsEnumerable’、‘AsAsyncEnumerable’、‘ToList’或‘ToListAsync’的调用显式切换到客户端计算
正如我在标题中提到的,我在.NET6上使用实体框架.
另一方面,如果我不考虑第二个GROUP BY,则查询可以正常工作:
public List<GroupedResponseItem> GetGroupedData(IQueryable<ResponseItem> responseItems)
{
return responseItems
.OrderByDescending(i => i.CreationDate)
.GroupBy(i => i.Group)
.Select(grp => new GroupedResponseItem()
{
Group = grp.Key,
Items = grp
.Select(i => new ResponseItem()
{
SubGroup = i.SubGroup,
CreationDate = i.CreationDate,
Value = i.Value
})
.ToList()
})
.ToList();
}