代码之家  ›  专栏  ›  技术社区  ›  Raúl Roa

实体框架:为什么导航属性在group by之后消失?

  •  2
  • Raúl Roa  · 技术社区  · 15 年前

    我通过以下查询检索集合:

    var numbers = _betDetailItem.GetBetDetailItems().Where(betDetailItem => betDetailItem.BetDetail.Bet.DateDrawing == resultToCreate.Date && betDetailItem.BetDetail.Bet.Status == 1).Where(condition);
    

    在那里,我可以访问我的导航属性并浏览绑定的信息。注意我是如何使用它们来过滤数据的。

    对结果分组后,导航属性变为空。

    var grouped = numbers.GroupBy(p => p.BetDetail.Bet);
    //Iterate through the collection created by the Grouping
    foreach (IGrouping<Bet, BetDetailItem> group in grouped)
    {
        var details = group.Key.BetDetails; //This is what doesn't work. BetDetails is a navigation property which was accessible in the previous query. 
    }
    

    我做错什么了吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Craig Stuntz    15 年前

    您将混淆实体和对象操作的LINQ。

    这是Linq to实体:

    var numbers = _betDetailItem.GetBetDetailItems().Where(betDetailItem => betDetailItem.BetDetail.Bet.DateDrawing == resultToCreate.Date && betDetailItem.BetDetail.Bet.Status == 1).Where(condition);
    

    这就是:

    var grouped = numbers.GroupBy(p => p.BetDetail.Bet);
    

    这些是对象操作:

    foreach (IGrouping<Bet, BetDetailItem> group in grouped)
    {
        var details = group.Key.BetDetails; //This is what doesn't work. BetDetails is a navigation property which was accessible in the previous query. 
    }
    

    在LinqToEntities中,不需要考虑加载相关实例。您始终可以引用任何对象的任何属性。但是,在某一点上,您希望从LINQ移到实体世界和对象空间,因为您希望使用类型的实例 BetDetail 代替类型 IQueryable<BetDetail> . 这意味着实体框架现在需要生成SQL来从数据库中检索数据。在这一点上,您将在稍后的代码中访问哪些相关实例并不雪上加霜。linq to entities查询中没有任何内容强制加载相关的 Bet .所以,除非您做了一些事情使它被加载,比如使用预加载、显式加载或EF4延迟加载,否则它将不会被加载。

    使用延迟加载(例如,在实体框架4中或在另一个ORM中)将生成此代码 出现 但由于生成了大量的数据库查询,速度将不必要地变慢。更好的解决方案是使用 eager loading projection . 这样一来,只有一个DB往返。

        2
  •  1
  •   Jay    15 年前

    一旦你做了 GroupBy() ,你不再与你的实体打交道了——他们…嗯,分组,所以 var 在里面 var grouped = ... 现在是类型 IEnumerable<IGrouping<... . 因此,在 grouped 集合是 IGrouping<> 接口。

    你可能想 OrderBy() 而不是 组() ,这取决于您的需要,或者您需要在两个级别上迭代:在 分组 以及每一个成员。

    一旦你进入某个特定的领域 i分组<gt; ,您应该可以访问正在查找的属性。