2011-08-05 86 views
3

我有回到过去的UserBattle记录每一个用户查询:转换IQueryable的<IEnumerable的<Entity>>到的IQueryable <Entity>

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

遗憾的是它不工作(至少MySQL的.NET连接器供应商不能将First转换为SQL)。作为替代方案,我可以用Take(1)替代第一个电话。但不幸的是,在这种情况下,结果将是IQueryable<IEnumerable<UserBattle>>而不是IQueryable<UserBattle>。有没有办法得到IQueryable<UserBattle>而不去LINQ To Objects(例如,SelectMany会解决我的问题)。

+0

尝试.SingleOrDefault(),你想要什么的方法 –

+0

如果你只选择一条记录,那么转到LINQ to Objects有什么问题? –

+0

@Bertrand Marron,每个用户一个 – SiberianGuy

回答

1

FirstFirstOrDefaultSingleSingleOrDefault工作的所有的LINQ的整理方法Entities查询的内容(如在“贪婪”运营商的方法结束这导致查询执行)。

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

这就是SQL Server的.NET Provider的情况。如果你的查询甚至不适用于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中不可用。

0

尝试.SingleOrDefault(),为你想

+0

不幸的是neighbour SingleOrDefault或FirstOrDefault转换为SQL(引发异常)。我想这是MySQL .NET Connector提供者的问题 – SiberianGuy

相关问题