系统.InvalidCastException:无法强制转换'System.Linq.GroupedEnumer
本文关键字:System GroupedEnumer Linq 转换 InvalidCastException 系统 | 更新日期: 2023-09-27 18:15:51
我正在将一些数据分组在一起,以便我可以在首页(ASPX)上显示它们。
我有以下代码:-
IEnumerable<ReportQuestion> questionSubjectGrps =
questionsBll.GetReportQuestions()
.Where(x => x.VersionId == iLatestVersion);
reportQuestionsList =
questionSubjectGrps.GroupBy(q => q.SubjectId,
(qid, qs) => qs.GroupBy(q => q.ParentId));
foreach (ReportQuestion reportQuestion in reportQuestionsList)
{
ReportQuestionsGuiDisplay reportQuestionsGuiDisplay =
new ReportQuestionsGuiDisplay();
reportQuestionsGuiDisplay.ParentQuestionTitle =
questionsBll.GetQuestionParents()
.FirstOrDefault(
x => x.QuestionParentId == reportQuestion.ParentId)
.QuestionParentTitle;
reportQuestionsGuiDisplay.ReportId = reportQuestion.ReportId;
reportQuestionsGuiDisplayList.Add(reportQuestionsGuiDisplay);
}
在前端(ASPX),我有以下内容:
<% foreach (ReportQuestionsGuiDisplay report in reportQuestionsGuiDisplayList)
{%>
<div class="hrLightBlue"></div>
<div class="RPTContentTitle2">
<%= report.SubjectTitle %>
</div>
<div class="hrLightBlue"></div>
<%} %>
然而,我得到以下错误:
无法强制转换类型的对象'
System.Linq.GroupedEnumerable``3[SCPerformance.Shared.Models.ReportQuestion,System.Nullable``1[System.Int32],SCPerformance.Shared.Models.ReportQuestion]
'输入'SCPerformance.Shared.Models.ReportQuestion
'
您正在呼叫:
IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TKey, IEnumerable<TSource>, TResult> resultSelector)
(见http://msdn.microsoft.com/en-us/library/bb549393.aspx)。
在您的例子中,结果是一个IEnumerable<IGrouping<TKey, TSource>>
。(参见http://msdn.microsoft.com/en-us/library/bb534501.aspx)
在foreach循环中这样做:
foreach (var group in reportQuestionsList)
{
foreach(ReportQuestion reportQuestion in group)
{
}
}
但我很困惑,你的代码似乎实现。在我看来,您只是将新的ReportQuestionsGuiDisplay
对象添加到平面列表中。为什么首先需要一个嵌套结构?你不能用OrderBy().ThenBy()
吗?此外,检索父标题的次数也比应该的要多。
我建议采用以下方法:
- group
questionSubjectGrps
by parent ID。 - …检索父标题
- …添加一个新的ReportQuestionsGuiDisplay到
reportQuestionsGuiDisplayList
- 按主题ID排序
reportQuestionsGuiDisplayList
,然后按父ID排序。
(这可能涉及到将ParentID和SubjectID属性添加到ReportQuestionsGuiDisplay
。或者ReportQuestion,如果合适的话)
或者在代码中:
var questionGroups =
questionsBll.GetReportQuestions()
.Where(x => x.VersionId == iLatestVersion)
.GroupBy(q => q.ParentId);
var displayList = new List<ReportQuestionsGuiDisplay>();
foreach (var questionGroup in questionGroups)
{
var title = questionsBll.GetQuestionParents()
.First(x => x.QuestionParentId == group.Key)
.QuestionParentTitle;
foreach (var question in questionGroup)
{
var reportQuestionsGuiDisplay =
new ReportQuestionsGuiDisplay()
{
ParentQuestionTitle = title,
ReportID = question.ReportID,
SubjectID = question.SubjectID,
ParentID = question.ParentID
};
displayList.Add(reportQuestionsGuiDisplay);
}
}
reportQuestionsGuiDisplayList = displayList.OrderBy(q => q.SubjectID)
.ThenBy(q => q.ParentID);