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

3

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

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

抱歉,它不起作用(至少MySQL .NET Connector提供程序无法将 First 转换为SQL)。作为替代,我可以用 Take(1) 替换First调用。但不幸的是,在这种情况下,结果将是 IQueryable<IEnumerable<UserBattle>> 而不是 IQueryable<UserBattle> 。是否有任何方法可以获取 IQueryable<UserBattle>而不去使用LINQ To Objects(例如,SelectMany将解决我的问题)?

尝试使用.SingleOrDefault(),这是你想要的方法。 - Prashant Lakhlani
如果您只选择一条记录,使用LINQ to Objects有什么问题吗? - Bertrand Marron
@Bertrand Marron,每个用户一个。 - SiberianGuy
你尝试过使用 FirstOrDefault 吗?在投影中,FirstSingleSingleOrDefault不被支持,即使在 SQL Server 中也是如此。 - Slauma
@Slauma,我试过了 - 不起作用。 - SiberianGuy
显示剩余3条评论
2个回答

1

FirstFirstOrDefaultSingleSingleOrDefault 都作为 LINQ to Entities 查询的 完成 方法工作(作为在末尾引起查询执行的“贪婪”运算符)。

然而,在投影(Select(...))中,只支持 FirstOrDefault

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

完整性起见,需要提到的是:LastLastOrDefault 在 LINQ to Entities 中根本不受支持,无论是作为完成方法还是在投影中。这就是为什么您的 Select 表达式必须编写为 gbu => gbu.OrderByDescending(bu => bu.DateTime).FirstOrDefault()。逻辑上相同的表达式 gbu => gbu.OrderBy(bu => bu.DateTime).LastOrDefault() 在 LINQ to Objects 中是可行的,但在 LINQ to Entities 中不可行。


0

尝试使用.SingleOrDefault(),这是你想要的方法。


很遗憾,SingleOrDefault和FirstOrDefault都不能转换为SQL(会引发异常)。我猜这是MySQL .NET连接器提供程序的问题。 - SiberianGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接