gpt4 book ai didi

entity-framework - Entity Framework Code First 4.3/LINQKit 相关表谓词

转载 作者:行者123 更新时间:2023-12-04 18:12:10 27 4
gpt4 key购买 nike

我使用 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() 方法接收位置。

我可以像这样重写谓词,但我不想这样做,因为我想要一个谓词工厂来为特定类型创建谓词(我不想以这种方式使用 Navigator 属性):
Expression<Func<Location, bool>> pred = PredicateBuilder.True<Location>();
pred = pred.And(loc => loc.TimeZone.TimeZoneCode == "EST");

我可以使用什么语法(如果有)来使用第一个示例中构造的谓词,它采用 TimeZone,而不是让它采用 Location 并通过导航属性遍历树(因为这不太可重用)。如果有一种方法可以利用 EF 首先拥有的关于导航属性的知识,并且能够使用范围限定为导航属性类型的谓词,那就太好了。

最佳答案

经过大约一周的努力,我发现您实际上可以做到这一点。步骤是:

  • 定义一个 Predicate 来查询你的内部属性 ( subPredicate )
  • Invoke那个subPredicate从另一个 Predicate ( predicate ) 中,针对父对象的属性。
  • Expand您的 predicate在您的 Where 中使用它时条款。

  • 这是您的示例的修订代码:
    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();

    关于entity-framework - Entity Framework Code First 4.3/LINQKit 相关表谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529881/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com