3
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吗?当我完成我需要的东西时?

4

2 回答 2

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

于 2012-05-01T18:35:56.037 回答
1

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

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

于 2012-05-01T18:24:49.113 回答