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<System.Linq.IGrouping<AnonymousType#1,iStellar.Model.questionhint>>
' 到“System.Collections.Generic.IList<iStellar.Model.questionhint>
”。一个 存在显式转换(您是否缺少演员表?)
此代码位于我的名为 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# LINQ 优雅地将 IEnumerable<IGrouping> 转换为 IEnumerable<IEnumerable>?