我有一个查询,它返回每个用户的最后一个UserBattle记录:
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就可以解决我的问题)。
发布于 2011-08-06 03:50:36
First、FirstOrDefault、Single和SingleOrDefault都作为LINQ to Entities查询的结束方法工作(作为最后的“贪婪”操作符,导致查询执行)。
但是,在投影中选择((...))仅支持 FirstOrDefault 。
SQL Server的.NET提供程序就是这种情况。如果您的查询甚至不能与FirstOrDefault一起使用,那么这很可能是MySQL .NET连接器的一个限制(是设计上的还是错误的?)。
仅为了完整性:Last和LastOrDefault在LINQ to Entities中根本不受支持,既不是作为完成方法,也不是在投影中。这就是为什么你的选择表达式必须写成gbu => gbu.OrderByDescending(bu => bu.DateTime).FirstOrDefault()的原因。逻辑相同的表达式gbu => gbu.OrderBy(bu => bu.DateTime).LastOrDefault()在LINQ to Objects中是可能的,但在LINQ to Entities中是不可能的。
发布于 2011-08-05 16:16:45
尝试.SingleOrDefault(),这是您想要的方法
https://stackoverflow.com/questions/6953190
复制相似问题