.net 为子查询提供表达式
我有以下LINQ到实体查询(简化形式): 引发异常“内部.NET Framework数据提供程序错误1025” 这里的问题是我的规范调用。此问题的通常解决方案是将规范表达式调用移出查询,并将表达式直接传递到何处。但它在这里不起作用,因为我需要将bu.BattleId传递给表达式 更新。 以下是BattleIDisqualto的代码:.net 为子查询提供表达式,.net,entity-framework,linq-to-entities,.net,Entity Framework,Linq To Entities,我有以下LINQ到实体查询(简化形式): 引发异常“内部.NET Framework数据提供程序错误1025” 这里的问题是我的规范调用。此问题的通常解决方案是将规范表达式调用移出查询,并将表达式直接传递到何处。但它在这里不起作用,因为我需要将bu.BattleId传递给表达式 更新。 以下是BattleIDisqualto的代码: public static Expression<Func<Model.Entities.BattleUser, bool>> UserId
public static Expression<Func<Model.Entities.BattleUser, bool>> UserIdIsEqualTo(long userId)
{
return bu => bu.UserId == userId;
}
public静态表达式UserIdIsEqualTo(长userId)
{
返回bu=>bu.UserId==UserId;
}
如果我假设BattleUserSpecifications.battleidisqualto(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);
}
//...
}
这可能不是您想要的,只是一种解决方法。我可以复制您原始查询中的例外情况。一个“内部错误”看起来像是代码在内部遍历一条相当意外的路径,很可能只有MS/EF团队才能真正回答出问题所在。您可能需要重写查询以获得所需的结果。我将再次尝试。如果您的目标是为每个battleid获取最新的battleuser,那么您可以使用此查询
ctx.BattlesUsers.GroupBy(bu => bu.BattleId)
.Select(bug => bug.OrderByDescending( bu => bu.DateTime).FirstOrDefault())
如果您想在此时使用表达式函数对其进行过滤,您可以,但您需要从外部获取您的用户ID,然后通过附加在末尾的Where子句将其传入。BATTERIDISQUALTO()
的返回类型是什么,它做了什么/是如何实现的?@svick,expression我们可以看看你的battleIDisqualto
吗,这样我们就知道我们在做什么了?@Marc gravel,我已经在更新部分添加了代码
var query = ctx.BattlesUsers.Where(
BattleUserSpecifications.FilterByDateTime(ctx.BattlesUsers));
ctx.BattlesUsers.GroupBy(bu => bu.BattleId)
.Select(bug => bug.OrderByDescending( bu => bu.DateTime).FirstOrDefault())