我在这里有此查询代码:

//Get all records based on ActivityID and TaskID.
public IList<Model.questionhint> GetRecords1(int listTask, int listActivity)
{
    IList<Model.questionhint> lstRecords = context.questionhints.ToList();
    return lstRecords.GroupBy(x => new { x.QuestionNo, x.ActivityID, x.TaskID  }).Where(a => a.TaskID == listTask && a.ActivityID == listActivity).ToList();
}


错误在于.Where语句,它说不包含ActivityIDTaskID的定义。

完整错误:


  'System.Linq.IGrouping'不包含'ActivityID'的定义,找不到扩展方法'ActivityID'接受类型为'System.Linq.IGrouping'的第一个参数(是否缺少using指令或程序集引用?)


我在查询语句方面很虚弱,基本上我想从数据库中检索记录,其中活动ID =某些东西和任务ID =某种东西,然后按questionNo,activityId和Task ID对其进行分组。

最佳答案

最简单的解决方法是:分组之前先过滤(where);这也将减少分组工作:

return context.questionhints
    .Where(a => a.TaskID == listTask && a.ActivityID == listActivity)
    .GroupBy(x => new { x.QuestionNo, x.ActivityID, x.TaskID  })
    .ToList();


如前所述,它在原始代码中不起作用的原因是,GroupBy返回了一组序列-每个组都有一个.Key(您的匿名类型),并且本身就是该序列的IEnumerable<T>序列该组中的项目。

然而!您的方法声称返回IList<Model.questionhint>;您的分组数据现在不是,也永远不会是IList<Model.questionhint>-它将是IList<IGrouping<{some anonymous type, Model.questionhint>>。因此:如果您声称它是IList<Model.questionhint>,则不能像这样进行分组-并且由于分组是匿名类型,因此无法将返回类型更改为匹配。您有两种选择:


不要分组
按可声明的内容(自定义类型或Tuple<...>)分组,然后将返回类型更改为匹配


例如:

public IList<IGrouping<Tuple<int,int,int>,Model.questionhint>>
        GetRecords1(int listTask, int listActivity)
{
    return context.questionhints
        .Where(a => a.TaskID == listTask && a.ActivityID == listActivity)
        .GroupBy(x => Tuple.Create(x.QuestionNo, x.ActivityID, x.TaskID))
        .ToList();
}

09-25 21:29