我在这里有这个查询代码:
//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'的定义,也没有接受第一个类型'System.Linq.IGrouping'的扩展方法'ActivityID'(你是否缺少using指令或汇编参考?)
我在查询语句中很弱,基本上我想从数据库中检索记录,其中activity id = something和task id = something,并按questionNo,activityId和Task ID对它们进行分组。
答案 0 :(得分:3)
这里最简单的解决方法是:在分组之前过滤(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();
}
答案 1 :(得分:2)
将其更改为Where(a => a.Key.TaskID == listTask && a.Key.ActivityID == listActivity)
您正在处理IGrouping,其中Key属性是匿名对象new { x.QuestionNo, x.ActivityID, x.TaskID }
这解决了原始错误,但现在我们正在尝试返回IGroupings,这不是正确的返回类型。更简洁的方法是
var groups = lstRecords.GroupBy(x => new { x.QuestionNo, x.ActivityID, x.TaskID }).Where(a => a.Key.TaskID == listTask && a.Key.ActivityID == listActivity);
IList<Model.questionhint> questionHints = new List<Model.questionhint>();
foreach(var group in groups)
{
questionHints.AddRange(group);
}
return questionHints;
注意,此代码未经测试。你可以在一个linq行中完成所有这些(因为我确定马克会),但我倾向于拆分它以便于阅读
<强>替代强>
如果您的目标是获得符合条件的所有问题提示,那么简单的Where子句有什么问题?
lstRecords.Where(a=>a.TaskID == listTask && a.ActivityID == listActivity).ToList();
<强>参考强>
http://msdn.microsoft.com/en-us/library/bb344977.aspx