Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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# 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只查询您绝对需要的内容

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

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


我是否可以从另一个方法调用此方法,并在完成所需操作后调用
产量中断

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>();
}