为子查询提供表达式

Sib*_*Guy 5 .net linq-to-entities entity-framework

我有以下LINQ To Entities查询(简化形式):

ctx.BattlesUsers.Where(bu => bu.DateTime == ctx.BattlesUsers.
   Where(BattleUserSpecifications.BattleIdIsEqualTo(bu.BattleId)).
   Max(bu1 => bu1.DateTime));
Run Code Online (Sandbox Code Playgroud)

抛出异常"内部.NET Framework数据提供程序错误1025".

这里的问题是我的规范电话.此问题的常见解决方案是将规范表达式调用移出查询并将表达式直接传递给Where.但它不会在这里工作,因为我需要将bu.BattleId传递给表达式.

更新.

这是BattleIdIsEqualTo的代码:

public static Expression<Func<Model.Entities.BattleUser, bool>> UserIdIsEqualTo(long userId)
{
   return bu => bu.UserId == userId;
}
Run Code Online (Sandbox Code Playgroud)

Sla*_*uma 3

如果我认为这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);
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后以下查询有效:

var query = ctx.BattlesUsers.Where(
    BattleUserSpecifications.FilterByDateTime(ctx.BattlesUsers));
Run Code Online (Sandbox Code Playgroud)

这可能不是您想要的,只是一种解决方法。我可以重现您在原始查询中遇到的异常。“内部错误”看起来像是代码在内部遍历了一条相当意外的路径,并且很可能只有 MS/EF 团队才能真正回答出了什么问题。您可能必须重写查询才能获得您想要的结果。