我有以下 LINQ To Entities 查询(以简化形式):
ctx.BattlesUsers.Where(bu => bu.DateTime == ctx.BattlesUsers.
Where(BattleUserSpecifications.BattleIdIsEqualTo(bu.BattleId)).
Max(bu1 => bu1.DateTime));
引发异常“内部 .NET Framework 数据提供程序错误 1025。”。
这里的问题是我的规范调用。此问题的通常解决方案是将规范表达式调用移出查询并将表达式直接传递给 Where。但它在这里不起作用,因为我需要将 bu.BattleId 传递给表达式。
更新。
这是 BattleIdIsEqualTo 的代码:
public static Expression<Func<Model.Entities.BattleUser, bool>> UserIdIsEqualTo(long userId)
{
return bu => bu.UserId == userId;
}
最佳答案
如果我假设 BattleUserSpecifications.BattleIdIsEqualTo(int battleId)
看起来很像 return bu => bu.BattleId == battleId;
我使用新规范得到以下结果:
public static class BattleUserSpecifications
{
public static Expression<Func<BattleUser, bool>> FilterByDateTime(
IQueryable<BattleUser> battleUsers)
{
return bu => bu.DateTime == battleUsers
.Where(bu1 => bu1.BattleId == bu.BattleId)
.Max(bu2 => bu2.DateTime);
}
//...
}
然后以下查询有效:
var query = ctx.BattlesUsers.Where(
BattleUserSpecifications.FilterByDateTime(ctx.BattlesUsers));
这可能不是您想要的,只是一种解决方法。我可以重现您在原始查询中遇到的异常。 “内部错误”看起来像是代码在内部遍历了一条相当意外的路径,很可能只有 MS/EF 团队才能真正回答出了什么问题。您可能必须重写查询才能获得所需的结果。
关于.net - 为子查询提供表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968143/