C#如何使用lambda表达式将iGrouping返回到列表

时间:2013-07-17 05:41:10

标签: c# linq entity-framework lambda dao

我正在使用实体框架来执行此操作,我有这个lambda表达式:

public IList<Model.questionhint> GetRecordsPlease(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.Key.TaskID == listTask 
                             && a.Key.ActivityID == listActivity)
                    .ToList();         
}

但它说:

  

无法隐式转换类型   'System.Collections.Generic.List<System.Linq.IGrouping<AnonymousType#1,iStellar.Model.questionhint>>'   到'System.Collections.Generic.IList<iStellar.Model.questionhint>'。一个   存在显式转换(您是否错过了演员?)

此代码位于名为DAOQuestionHint的CRUD类文件中。

我如何返回这个因为我需要在我的xaml.cs(代码隐藏)中调用它,如下所示:

  

私人DAO.DAOQuestionHint qh =新DAO.DAOQuestionHint();

IList<Model.questionhint> lstQuestionHints = qh.GetRecordsPlease(taskID, activityID);

这就是我的数据库表的样子:

enter image description here

我想要的是将同一个activityID,taskID和questionNo的记录组合在一行,现在每条记录都是逐行分开的:

enter image description here

我希望它像

我[回答]每天下午小睡一次

太阳[回答]没有绕地球移动。

所以我试图通过使用for循环在代码中使用替代,但是如果有3个或更多相同的activityID,taskID和questionNo的记录,则不能完美地工作,所以我需要在查询中对它们进行分组首先。

1 个答案:

答案 0 :(得分:3)

在我看来,你根本不需要分组 - 你只需要过滤。除非你每个问题确实有多个提示(具有相同的任务和活动),否则你只需要:

public IList<Model.questionhint> GetRecordsPlease(int listTask, int listActivity)
{
    return context.questionhints
                  .Where(a => a.TaskID == listTask && a.ActivityID == listActivity)
                  .ToList();
}

请注意,与当前代码不同,这将在数据库中执行过滤,而不是将整个表拉到客户端,然后进行分组/过滤。您需要注意,只要您使用context.SomeTable.ToList(),就会获取该表的全部内容。

我还强烈建议您更改模型以使用遵循.NET命名约定的类型名称,因此QuestionHint而不是questionhint

(最后,我会从方法名称中删除Please - 计算机不需要你在这样的命名中保持礼貌。)

编辑:如果您确实 想要群组,则需要更改返回值。例如,您可以返回一系列组:

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

我故意在分组之前调用ToList()然后再调用,以便数据被提取一次,然后您可以迭代这些组,无需返回数据库。 (有可能最后ToList就足够了,但我不想肯定地说。)