Linq lambda实体,不包含定义

时间:2013-07-11 06:50:55

标签: c# linq lambda dao

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

//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'的定义,也没有接受第一个类型'System.Linq.IGrouping'的扩展方法'ActivityID'(你是否缺少using指令或汇编参考?)

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

2 个答案:

答案 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