我有一个查询,它返回每个用户的最后一条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会解决我的问题)。
答案 0 :(得分:1)
First
,FirstOrDefault
,Single
和SingleOrDefault
全部用作LINQ to Entities查询的整理方法(如“贪婪”)最后导致查询执行的运算符。
但投影中的(选择(...))仅支持FirstOrDefault
。
.NET Server的.NET提供程序就是这种情况。如果您的查询甚至不能与FirstOrDefault
一起使用,那么它很可能是MySQL .NET Connector的限制(按设计或作为错误?)。
仅提及完整性:LINQ to Entities中不支持Last
和LastOrDefault
,既不是完成方法也不是投影。这就是为什么您的Select表达式必须写为gbu => gbu.OrderByDescending(bu => bu.DateTime).FirstOrDefault()
的原因。逻辑相同的表达式gbu => gbu.OrderBy(bu => bu.DateTime).LastOrDefault()
在LINQ to Objects中是可能的,但在LINQ to Entities中不可能。
答案 1 :(得分:0)
尝试.SingleOrDefault(),那个你想要的方法