我正在使用 Entity Framework 4.3.1 和 Code First 方法。另外,我正在使用 LinqKit 以便使用 PredicateBuilder。
如果我有这样的表:
位置、时区(多:1)
..我希望有这样的东西:
Expression<Func<TimeZone, bool>> pred = PredicateBuilder.True<TimeZone>();
pred = pred.And(tz => tz.TimeZoneCode == "EST");
List<Location> locations = context.Locations
.AsExpandable().Where(pred)
.Select(loc => loc).ToList();
这不起作用,因为谓词被构建为接受 TimeZone,但Where() 方法接收 Location。
我可以像这样重写谓词,但我不想这样做,因为我想要一个为特定类型创建谓词的谓词工厂(我不想以这种方式使用导航器属性):
Expression<Func<Location, bool>> pred = PredicateBuilder.True<Location>();
pred = pred.And(loc => loc.TimeZone.TimeZoneCode == "EST");
我可以使用什么语法(如果有)来使用第一个示例中构造的谓词,其中它采用 TimeZone,而不是采用 Location 并通过导航属性遍历树(因为这可重用性较差)。如果有一种方法可以首先利用 EF 所拥有的有关导航属性的知识,并且能够使用作用域为导航属性类型的谓词,那就太好了。
经过大约一周的努力,我发现你实际上可以做到这一点。步骤是:
- 定义一个谓词,它是对您的内部属性的查询(
subPredicate
)
-
Invoke
that subPredicate
来自另一个谓词 (predicate
),针对父对象的属性。
-
Expand
your predicate
当你使用它时Where
clause.
这是您的示例的修改后的代码:
var subPredicate = PredicateBuilder.True<TimeZone>();
subPredicate = subPredicate.And(tz => tz.TimeZoneCode == "EST");
var predicate = PredicateBuilder.True<Location>();
predicate = predicate.And(l => subPredicate.Invoke(l.TimeZone));
List<Location> locations = context.Locations
.AsExpandable().Where(pred.Expand())
.Select(loc => loc).ToList();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)