用LINQ对数据进行分组不起作用

3
我想查询一个表并按BillPeriodId字段进行分组,我正在按照文章中的示例实现。以下是执行分组的方法。
public List<BillPeriodLine> GetLinesGroupedByPeriod()
{
    var linesGrouped = _lineRepository.AllIncluding(p => p.BillPeriod)
                                          .GroupBy(pl => pl.BillPeriodId)
                                          .Select(g => new Group<int, BillPeriodLine>
                                          {
                                              Key = g.Key,
                                              Values = g
                                          });
    return new List<BillPeriodLine>(linesGrouped);
}

可发现类型

public class Group<T, K>
{
    public K Key;
    public IEnumerable<T> Values;
}

但是它用以下错误信息强调了g.Key:

无法隐式转换类型'int'为'BillTracker.Entities.BillPeriodLine'

这与示例中的操作方式完全相同,只是我在使用lambda表达式。使用LINQ语句时也会出现相同的错误。我不知道自己做错了什么。请有人指引我正确的方向吗?

2个回答

6
您将TK搞反了(或者反过来了)。
new Group<int, BillPeriodLine>

...

public class Group<T, K>
{
    public K Key;
    public IEnumerable<T> Values;
}

无法将类型'int'隐式转换为'BillTracker.Entities.BillPeriodLine' 这条信息已经说得很明白了,你试图把一个方形钉子塞进一个圆孔中。

6
我认为将方形钉放入圆孔中并没有问题。 - JensB
1
@JensB 只要有意愿,就一定有办法。 - TheGeneral
@MichaelRandall 很好的答案 :) - Fabjan

4

虽然Michael Randall的答案在错误消息方面完全正确,但这只是问题的一部分。

我猜你想像链接所示那样,在某种表格中显示已分组的BillPeriodLine。无论如何,你不能简单地返回一个List<BillPeriodLine>并假设它会神奇地分组,也不能从一个IEnumerable<Group<int, BillPeriodLine>>-这是linesGrouped的类型-创建List<BillPeriodLine>。大概你尝试做的是返回一个List<Group<int, BillPeriod>>

public List<Group<int, BillPeriodLine>> GetLinesGroupedByPeriod()
{
    var linesGrouped = _lineRepository.AllIncluding(p => p.BillPeriod)
                                      .GroupBy(pl => pl.BillPeriodId)
                                      .Select(g => new Group<int, BillPeriodLine>
                                      {
                                          Key = g.Key,
                                          Values = g
                                      });
    return linesGrouped.ToList();
}

这个 List<Group<int, BillPeriodLine>> 可以在视图中使用,如下所示的示例:视图正在遍历 List<Group<int, BillPeriodLine>>。对于每个 Group<int, BillPeriodLine>,它创建组的标题,然后遍历 Group<int,BillPeriodLine>.Values 中的所有项目,为每个 BillPeriodLine 创建一行。

此外(正如Michael所说),您需要交换 Group<T,U> 类的类型参数(或在创建 Group<int, BillPeriodLine> 的位置上切换类型,但我更喜欢前者,因为我认为将键放在首位更直观)。


谢谢Paul。我在收到你的回复时已经在努力解决它了。感谢你的洞察力。非常准确! - Kacey Ezerioha
很高兴能够帮助。 - Paul Kertscher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接