内部.NET Framework数据提供程序错误1025

IQueryable<Organization> query = context.Organizations; Func<Reservation, bool> predicate = r => !r.IsDeleted; query.Select(o => new { Reservations = o.Reservations.Where(predicate) }).ToList(); 

此查询会引发“内部.NET Framework数据提供程序错误1025”exception,但下面的查询不会。

 query.Select(o => new { Reservations = o.Reservations.Where( r => !r.IsDeleted) }).ToList(); 

我需要使用第一个,因为我需要检查一些if语句来构造正确的谓词。 我知道我不能在这种情况下使用if语句,这就是为什么我传递一个委托作为参数。

我怎样才能使第一个查询工作?

虽然上述答案是正确的,但请注意,在select语句之后尝试使用它时,必须显式调用AsQueryable() ,否则编译器将假定我们正在尝试使用IEnumerable方法,这些方法需要Func而不是Expression<Func>

这可能是原始海报的问题,否则编译器会在大多数情况下抱怨它正在寻找Expression<Func>而不是Func

演示:以下将失败:

 MyContext.MySet.Where(m => m.SubCollection.Select(s => s.SubItem).Any(expr)) .Load() 

虽然以下内容将起作用:

 MyContext.MySet.Where(m => m.SubCollection.Select(s => s.SubItem).AsQueryable().Any(expr)) .Load() 

创造赏金(老鼠!)之后,我发现了这个答案 ,解决了我的问题。 (我的问题涉及.Any()调用,这比这个问题稍微复杂一些…)

总之,这是你的答案:

 IQueryable<Organization> query = context.Organizations; Expression<Func<Reservation, bool>> expr = r => !r.IsDeleted; query.Select(o => new { Reservations = o.Reservations.Where(expr) }) .ToList(); 

阅读引用的答案,解释为什么需要局部variablesexpr ,而不能直接引用另一种返回typesExpression<Func<Reservation, bool>>

谢谢你给我打电话 毕竟,我想我是在正确的轨道上。

无论如何,要重申, LINQ to Entities (感谢Jon Skeet在我自己的思想过程中混淆了意见时纠正了我)在expression式树上运行 ; 它允许投影将QueryProvider将lambdaexpression式转换为SQL 。

常规Func<>适用于LINQ to Objects。

所以在这种情况下,当使用entity framework时,传递给EF的IQueryable谓词必须是Expression<Func<>>

我刚刚在另一种情况下遇到了这个问题。

我有一个静态类充满Expression谓词,然后我可以组合或传递给EF查询。 其中之一是:

  public static Expression<Func<ClientEvent, bool>> ClientHasAttendeeStatus( IEnumerable<EventEnums.AttendeeStatus> statuses) { return ce => ce.Event.AttendeeStatuses .Where(a => a.ClientId == ce.Client.Id) .Select(a => a.Status.Value) .Any(statuses.Contains); } 

这是由于Contains方法组调用抛出1025错误。 entity framework期望一个expression式,并find一个方法组 ,导致错误。 将代码转换为使用lambda(可以隐式转换为Expression)修复了错误

  public static Expression<Func<ClientEvent, bool>> ClientHasAttendeeStatus( IEnumerable<EventEnums.AttendeeStatus> statuses) { return ce => ce.Event.AttendeeStatuses .Where(a => a.ClientId == ce.Client.Id) .Select(a => a.Status.Value) .Any(x => statuses.Contains(x)); } 

除此之外:然后我将expression式简化为ce => ce.Event.AttendeeStatuses.Any(a => a.ClientId == ce.Client.Id && statuses.Contains(a.Status.Value));