1

我在这里有这个查询代码:

//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声明中,它说不包含ActivityIDand的定义TaskID

完全错误:

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

我的查询语句很弱,基本上我想从数据库中检索活动 id = something 和 task id = something 的记录,并按 questionNo、activityId 和 Task ID 对它们进行分组。

4

2 回答 2

3

这里最简单的解决方法是:在分组之前过滤(哪里);这也将减少分组必须做的工作:

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>你有两个选择:

  • 不要分组
  • 按可声明的东西(自定义类型或 a 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(); 
}
于 2013-07-11T06:54:43.640 回答
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 行中完成所有这些操作(我确信 Mark 会这样做),但是为了便于阅读,我倾向于将其拆分

选择

如果您的目标是获得所有符合条件的 questionHint,那么简单的 Where 子句有什么问题?

lstRecords.Where(a=>a.TaskID == listTask && a.ActivityID == listActivity).ToList();

参考资料
http://msdn.microsoft.com/en-us/library/bb344977.aspx

于 2013-07-11T06:53:18.117 回答