【问题标题】:Provide expression to subquery为子查询提供表达式
【发布时间】:2011-08-06 16:26:49
【问题描述】:

我有以下 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;
}

【问题讨论】:

  • BattleIdIsEqualTo() 的返回类型是什么,它有什么作用/它是如何实现的?
  • @svick, 表达式>
  • 我们可以看看你的BattleIdIsEqualTo,这样我们就知道我们在这里工作的是什么?
  • @Marc Gravell,我已将代码添加到更新部分

标签: .net entity-framework linq-to-entities


【解决方案1】:

如果我假设 BattleUserSpecifications.BattleIdIsEqualTo(int battleId) 看起来与 return bu =&gt; 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 团队才能真正回答问题所在。您可能必须重写查询才能获得所需的结果。

【讨论】:

    【解决方案2】:

    我要再试一次。如果您的目标是获取每个 Battleid 的最新战斗用户,那么您可以使用此查询

        ctx.BattlesUsers.GroupBy(bu => bu.BattleId)
        .Select(bug => bug.OrderByDescending( bu => bu.DateTime).FirstOrDefault())
    

    如果您想在此时使用表达式函数对其进行过滤,您可以,但您需要从外部获取您的用户 ID,然后通过添加到末尾的 Where 子句将其传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-03
      • 2021-03-12
      • 2021-01-29
      • 2012-07-23
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多