系统.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 '

系统.InvalidCastException:无法强制转换'System.Linq.GroupedEnumer

您正在呼叫:

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()吗?此外,检索父标题的次数也比应该的要多。

我建议采用以下方法:

  1. group questionSubjectGrps by parent ID。
  2. …检索父标题
  3. …添加一个新的ReportQuestionsGuiDisplay到reportQuestionsGuiDisplayList
  4. 按主题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);