NHibernate懒惰关注

时间:2012-05-01 01:49:30

标签: c# hibernate nhibernate yield lazy-evaluation

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吗?

2 个答案:

答案 0 :(得分:1)

IQuery.List总是返回整个结果集,因此使用yield break来提前终止使用循环并没有帮助变得更加懒惰。

最好的事情是(如果在这种情况下这是可行的)将您真正需要的项目从结果集中放入查询中,这样就不会导致获取不需要的数据。

答案 1 :(得分:1)

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

如果您仍需要在优化后尽可能保持懒惰,请使用ICriteria.Future<T>()代替ICriteria.List<T>()

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延迟查询而不是整个列表。如果有机会,它有时也会优化查询。