【发布时间】:2012-08-12 23:30:14
【问题描述】:
IQueryable<Organization> query = context.Organizations;
Func<Reservation, bool> predicate = r => !r.IsDeleted;
query.Select(o => new {
Reservations = o.Reservations.Where(predicate)
}).ToList();
此查询会引发“Internal .NET Framework Data Provider error 1025”异常,但下面的查询不会。
query.Select(o => new {
Reservations = o.Reservations.Where( r => !r.IsDeleted)
}).ToList();
我需要使用第一个,因为我需要检查一些 if 语句来构造正确的谓词。我知道在这种情况下我不能使用 if 语句,这就是我将委托作为参数传递的原因。
我怎样才能使第一个查询工作?
【问题讨论】:
-
我不完全确定这是否是原因(甚至是正确的方向),但
Linq2Objects在表达式树上运行,这意味着您通常通过Expression<Func<Reservation, bool>> predicate而不是裸Func<Reservation, bool> predicate.你可以随时尝试。 :) -
听起来您可能需要一个谓词构建器。看看这个问题。 stackoverflow.com/questions/9184942/…
-
@Trustme-I'maDoctor:你错了 - LINQ to Objects 使用委托。它是使用表达式树的 LINQ to SQL 等,因为它们需要将查询转换为 SQL。 LINQ to Objects 可以直接执行谓词、项目等。
-
@JonSkeet 绝对是,但很好区分。我有时会忘记,并非您使用 LINQ 的所有集合都以某种方式受数据库支持 :) 在完全不相关的旁注中,您的书是一本很棒的书,我想在接下来的几本书中我会做更多的阅读未来几周。
-
@JonSkeet - 我得到的行为与 OP 完全相同,除了我将谓词抽象为静态方法,因为我在很多地方都使用它。我不想将谓词复制并粘贴到所有使用它的地方。解决办法是什么?
标签: c# .net entity-framework entity-framework-4 expression-trees