Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
限制返回的NHibernate实体_Nhibernate_Many To Many_Max - Fatal编程技术网

限制返回的NHibernate实体

限制返回的NHibernate实体,nhibernate,many-to-many,max,Nhibernate,Many To Many,Max,我试图限制NHibernate标准将返回的实体的数量。标准似乎是使用SetMaxResults,但如果我的条件涉及多对多关系上的左外部联接,则这无法正常工作 例如: 狗有主人(多对多的关系),我需要检索最多10只属于某一组主人的狗。做 session.CreateCriteria<Dog>() .CreateAlias("Owners", "Owners") .Add(Restrictions.In("Owners.Id", idCollection) .SetMaxRe

我试图限制NHibernate标准将返回的实体的数量。标准似乎是使用SetMaxResults,但如果我的条件涉及多对多关系上的左外部联接,则这无法正常工作

例如:

狗有主人(多对多的关系),我需要检索最多10只属于某一组主人的狗。做

session.CreateCriteria<Dog>()
  .CreateAlias("Owners", "Owners")
  .Add(Restrictions.In("Owners.Id", idCollection)
  .SetMaxResults(10)
  .List<Dog>();

我的最高限制发生得太早,导致一只拥有多个主人且符合标准的狗数到我的10次限制。有没有一个干净的方法告诉NHibernate我只想让它水合第一个X狗的物体?我可能无法对数据库执行完全选择,但如果我可以避免加载系统中的每只狗,那就太好了,因为我只会显示其中的10只狗。

这种情况下的解决方案是一个子查询。我们需要的是创建内部选择,它将被狗主人过滤并返回狗的ID。然后我们将查询狗,通过子查询过滤它们。最后,当在平面结构上执行分页时,我们的分页将是正确的

有关更多详细信息,请参见此答案:

子查询:

具有正确分页的查询

session.CreateCriteria(typeof(Dog))
    .Add(Subqueries.PropertyEq("ID", subQuery));
    // PAGING goes here
    .SetMaxResults(10)
    .List();

但是你不是被主人限制了吗?这意味着拥有多个主人的狗不应该是一个问题(除非你允许在主人\狗中重复行)?谢谢你指出这一点。我在现实世界中的情景要复杂一点。我修正了这个例子,使之更适用。你是个很棒的家伙!谢谢你的回答。我要做的唯一一个小改动是使用subquerys.PropertyIn(“ID”,subQuery)vs PropertyEq,因为子查询本身返回多行。如果这样做有效,那就太好了;)太棒了,你已经根据自己的需要调整了。祝你好运
DetachedCriteria subQuery = DetachedCriteria.For(typeof(Dog))
    // WHERE conditions go here
    .SetProjection( Projections.Property("ID") )
;
session.CreateCriteria(typeof(Dog))
    .Add(Subqueries.PropertyEq("ID", subQuery));
    // PAGING goes here
    .SetMaxResults(10)
    .List();