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