C# NHibernate懒惰担忧 public IEnumerable GetLatestUserReadNews(IEnumerable用户ID) { IQuery query=Session.CreateQuery(“来自UserReadNews as j,其中j.FacebookUser_id in(:userid)”); SetParameterList(“userid”,userid); 返回query.List(); }
我有一种方法,希望尽可能延迟地返回这些数据,因为我正在确定要显示哪些数据,然后停止。我不希望对整个表执行整个查询 我关心的是List()方法。这是懒惰还是渴望C# NHibernate懒惰担忧 public IEnumerable GetLatestUserReadNews(IEnumerable用户ID) { IQuery query=Session.CreateQuery(“来自UserReadNews as j,其中j.FacebookUser_id in(:userid)”); SetParameterList(“userid”,userid); 返回query.List(); },c#,hibernate,nhibernate,yield,lazy-evaluation,C#,Hibernate,Nhibernate,Yield,Lazy Evaluation,我有一种方法,希望尽可能延迟地返回这些数据,因为我正在确定要显示哪些数据,然后停止。我不希望对整个表执行整个查询 我关心的是List()方法。这是懒惰还是渴望 我是否可以从另一个方法调用此方法,并在完成所需操作后调用产量中断?IQuery.List始终返回整个结果集,因此提前终止具有产量中断的消费循环不会帮助我变得更懒惰 最好的方法是(如果在这种情况下可行的话)从查询中已经存在的结果集中确定您真正需要的项目,这样您就不会在获取不需要的数据时花费精力。我同意@CSharper只查询您绝对需要的内容
我是否可以从另一个方法调用此方法,并在完成所需操作后调用
产量中断
?IQuery.List始终返回整个结果集,因此提前终止具有产量中断的消费循环不会帮助我变得更懒惰
最好的方法是(如果在这种情况下可行的话)从查询中已经存在的结果集中确定您真正需要的项目,这样您就不会在获取不需要的数据时花费精力。我同意@CSharper只查询您绝对需要的内容 如果在优化之后仍然需要使其尽可能地懒惰,请使用
ICriteria.Future()
而不是ICriteria.List()
:
public IEnumerable GetLatestUserReadNews(IEnumerable用户ID)
{
IQuery query=Session.CreateQuery(“来自UserReadNews as j,其中j.FacebookUser_id in(:userid)”);
SetParameterList(“userid”,userid);
返回query.Future();
}
Future
将为您提供一个带有延迟查询的实际IEnumerable,而不是一个完整的列表。如果有机会,它有时也会优化查询。延迟加载仅适用于子实体和查找的上下文。在您的查询中,如果查询结果有500万行,那么您的代码仍将获取100万行,您最好将LIMIT子句或TOP子句放在其中。有两种延迟加载,一种发生在ORM数据库操作中,正如我前面提到的。另一个是在语言中,ToList()
急切地将元素加载到内存对象中。我不知道那List()
是否急切地加载对象。尝试检查列表返回对象的对象类型,如果它是列表
或列表
,它将被急切地加载。如果它是IQueryable
、IQueryable
、IEnumerable
或IEnumerable
,则它是延迟加载的
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();
}
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>();
}