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

Posted

技术标签:

【中文标题】C#如何使用 lambda 表达式将 iGrouping 返回到列表【英文标题】:C# How do i return iGrouping to a list using lambda expression 【发布时间】:2013-07-15 13:02:18 【问题描述】:

我正在使用实体框架来执行此操作,我有这个 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&lt;System.Linq.IGrouping&lt;AnonymousType#1,iStellar.Model.questionhint&gt;&gt;' 到“System.Collections.Generic.IList&lt;iStellar.Model.questionhint&gt;”。一个 存在显式转换(您是否缺少演员表?)

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

我如何返回这个,因为我需要像这样在我的 xaml.cs(后面的代码)中调用它:

私有 DAO.DAOQuestionHint qh = new DAO.DAOQuestionHint();

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

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

我想要的是将相同activityID、taskID和questionNo的记录组合在一行中,现在每条记录都像这样逐行分隔:

我希望它像

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

太阳 [答案] 不会绕地球转。

所以我尝试通过使用 for 循环在后面的代码中使用替代方案,但如果有 3 条或更多条相同的 activityID 、 taskID 和 questionNo 记录,这将无法完美运行,所以我需要在查询中对它们进行分组首先。

【问题讨论】:

好吧,您已经创建了一系列组 - 您如何想要将*这些作为单个列表返回。目前尚不清楚您期望的结果是什么。 (我还建议将Where 调用移动到之前 GroupBy 调用 - 因为您只有一个活动 ID 和一个任务 ID,所以按这些进行分组没有意义。您可以按QuestionNo 分组。) 【参考方案1】:

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

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 就足够了,但我不想肯定地说。)

【讨论】:

我在它运行良好之前就这样做了,但我需要对它们进行分组,因为在数据库中,有多个相同 QuestionNo 的记录 .. 一些记录具有相同的活动 id 和 taskid 但不同的 questionNo ,所以我需要根据它们对它们进行分组。 @user2376998:但是对于同一个问题同一个任务和活动是否有多个记录?如果有,您希望它们如何在结果中分组?目前,您的方法的返回类型是只是 提示列表...它不是提示组列表。你必须决定你真正想要什么...... @user2376998:如果您确实想要分组,则需要更改返回类型,不是吗?再说一次,我认为您并没有真正考虑过这一点:您是说您想要一个提示列表,但您还希望将它们分组。你不能同时拥有它。 我需要先将其分组并返回该组列表 @user2376998:好的,我已经编辑了我的答案,以展示这很容易做到。但是你真的需要考虑你希望你的方法在将来返回什么 first - 从错误的返回类型开始并试图将数据硬塞进去是没有意义的。

以上是关于C#如何使用 lambda 表达式将 iGrouping 返回到列表的主要内容,如果未能解决你的问题,请参考以下文章

C#将字典的LINQ查询重构为单个lambda表达式[关闭]

使用 C# 使用 lambda 表达式过滤和添加值

C# - 如何获取传递的 lambda 表达式的值

C# 将 Lambda 表达式作为方法参数传递

C# Lambda表达式详细总结

C# LINQ 优雅地将 IEnumerable<IGrouping> 转换为 IEnumerable<IEnumerable>?