首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IQueryable<IEnumerable<Entity>>转换为IQueryable<Entity>

将IQueryable<IEnumerable<Entity>>转换为IQueryable<Entity>
EN

Stack Overflow用户
提问于 2011-08-05 15:59:59
回答 2查看 389关注 0票数 3

我有一个查询,它返回每个用户的最后一个UserBattle记录:

代码语言:javascript
复制
objectContext.UserBattles.
GroupBy(bu => bu.UserId, bu => bu).
Select(gbu => gbu.OrderByDescending(bu => bu.DateTime).First());

不幸的是,它不能工作(至少MySQL .NET连接器提供程序不能将First转换为SQL语言)。作为替代,我可以用Take(1)代替First call。但不幸的是,在这种情况下,结果将是IQueryable<IEnumerable<UserBattle>>而不是IQueryable<UserBattle>。有没有办法在不使用LINQ to Objects的情况下获得IQueryable<UserBattle> (例如,SelectMany就可以解决我的问题)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-06 03:50:36

FirstFirstOrDefaultSingleSingleOrDefault都作为LINQ to Entities查询的结束方法工作(作为最后的“贪婪”操作符,导致查询执行)。

但是,在投影中选择((...))仅支持 FirstOrDefault

SQL Server的.NET提供程序就是这种情况。如果您的查询甚至不能与FirstOrDefault一起使用,那么这很可能是MySQL .NET连接器的一个限制(是设计上的还是错误的?)。

仅为了完整性:LastLastOrDefault在LINQ to Entities中根本不受支持,既不是作为完成方法,也不是在投影中。这就是为什么你的选择表达式必须写成gbu => gbu.OrderByDescending(bu => bu.DateTime).FirstOrDefault()的原因。逻辑相同的表达式gbu => gbu.OrderBy(bu => bu.DateTime).LastOrDefault()在LINQ to Objects中是可能的,但在LINQ to Entities中是不可能的。

票数 1
EN

Stack Overflow用户

发布于 2011-08-05 16:16:45

尝试.SingleOrDefault(),这是您想要的方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6953190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档