我想按字段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请指出正确的方向吗?
答案 0 :(得分:6)
你有T
和K
错误的方式(或反之亦然)
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>
的类型,但我更喜欢前者,因为我认为关键是首先更直观一点。)