我在这里有此查询代码:
//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
语句,它说不包含ActivityID
和TaskID
的定义。完整错误:
'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();
}