【问题标题】:NHibernate laziness concernNHibernate 懒惰问题
【发布时间】:2012-05-01 01:49:30
【问题描述】:
public IEnumerable<UserReadNews> GetLatestUserReadNews(IEnumerable<string> userIds)
{

    IQuery query = Session.CreateQuery("from UserReadNews as j where j.FacebookUser_id in (:userIds)");
    query.SetParameterList("userIds", userIds );
    return query.List();
}

我有这种方法,我想尽可能延迟地返回这些数据,因为我正在确定要显示哪些数据然后停止。我不希望针对整个表执行整个查询。

我关心的是 List() 方法。这是懒惰还是渴望?

当我完成所需的操作后,我可以从另一个方法和yield break 调用此方法吗?

【问题讨论】:

  • 延迟加载仅适用于子实体和查找的上下文。在您的查询中,如果查询结果有 500 万行,您的代码仍然会获取 100 万行,您宁愿将 LIMIT 子句或 TOP 子句放在那里
  • 懒加载有两种,一种发生在ORM-database操作中,我上面提到过。另一种是在语言中,ToList() 急切地将元素加载到内存对象中。我不知道List() 是否急切地加载对象。尝试检查List返回对象的对象类型,如果是ListList&lt;classhere&gt;,则为热切加载。如果是IQueryableIQueryable&lt;classhere&gt;IEnumerableIEnumerable&lt;classhere&gt;,则为延迟加载

标签: c# hibernate nhibernate yield lazy-evaluation


【解决方案1】:

我同意 @CSharper 关于只查询您绝对需要的内容。

如果您在优化后仍需要使其尽可能懒惰,请使用ICriteria.Future&lt;T&gt;() 而不是ICriteria.List&lt;T&gt;()

public IEnumerable<UserReadNews> GetLatestUserReadNews(IEnumerable<string> userIds)
{
    IQuery query = Session.CreateQuery("from UserReadNews as j where j.FacebookUser_id in (:userIds)");
    query.SetParameterList("userIds", userIds );
    return query.Future<UserReadNews>();
}

Future 将为您提供一个带有延迟查询的实际 IEnumerable,而不是立即提供整个列表。如果有机会,它有时也会优化查询。

【讨论】:

    【解决方案2】:

    IQuery.List 总是返回整个结果集,因此提前终止使用 yield 的循环无助于变得更加懒惰。

    最好的办法是(如果在这种情况下可行的话)将您真正需要的结果集中在查询中,这样您就不会费力地获取不需要的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 2014-03-03
      • 2010-11-25
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      相关资源
      最近更新 更多