内部.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));