转换IQueryable <ienumerable <entity>&gt;到IQueryable <entity> </entity> </ienumerable <entity>

时间:2011-08-05 07:59:59

标签: .net entity-framework

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

objectContext.UserBattles.
GroupBy(bu => bu.UserId, bu => bu).
Select(gbu => gbu.OrderByDescending(bu => bu.DateTime).First());

不幸的是它不起作用(至少MySQL .NET Connector提供程序无法将First转换为SQL)。作为替代方案,我可以用Take(1)替换第一次呼叫。但遗憾的是,在这种情况下,结果将是IQueryable<IEnumerable<UserBattle>>而不是IQueryable<UserBattle>。有没有办法获得IQueryable<UserBattle>而无需转到LINQ To Objects(例如,SelectMany会解决我的问题)。

2 个答案:

答案 0 :(得分:1)

FirstFirstOrDefaultSingleSingleOrDefault全部用作LINQ to Entities查询的整理方法(如“贪婪”)最后导致查询执行的运算符。

但投影中的(选择(...))仅支持FirstOrDefault

.NET Server的.NET提供程序就是这种情况。如果您的查询甚至不能与FirstOrDefault一起使用,那么它很可能是MySQL .NET Connector的限制(按设计或作为错误?)。

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

答案 1 :(得分:0)

尝试.SingleOrDefault(),那个你想要的方法