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

时间:2018-02-21 08:46:18

标签: c# linq

我想按字段BillPeriodId查询表和分组,并且我正在按照article中的示例的方式实现它。以下是进行分组的方法

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'

除了我正在使用lamda表达式之外,它正是在示例中完成的方式。它使用LINQ语句提供相同的错误。我不知道我做错了什么。 Sompne请指出正确的方向吗?

2 个答案:

答案 0 :(得分:6)

你有TK错误的方式(或反之亦然

new Group<int, BillPeriodLine>

...

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

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

信息说得很完美,你试图在一个圆孔中推一个方形钉子

答案 1 :(得分:4)

尽管迈克尔·兰德尔对错误信息的回答非常合理,但这只是问题的一部分。

我猜你想在某种表格中显示已分组的BillPeriodLine,如您提供的链接所示。无论如何,你不能简单地返回List<BillPeriodLine>并假设它被神奇地分组,你也不能从List<BillPeriodLine>创建IEnumerable<Group<int, BillPeriodLine>> - 这是linesGrouped的类型。大概你要做的是返回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创建一行。

此外(正如迈克尔所说)你必须交换Group<T,U>类的类型参数(或切换你创建Group<int, BillPeriodLine>的类型,但我更喜欢前者,因为我认为关键是首先更直观一点。)