Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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标准API是否支持集合属性的预测?_C#_Nhibernate_Criteria - Fatal编程技术网

C# NHibernate标准API是否支持集合属性的预测?

C# NHibernate标准API是否支持集合属性的预测?,c#,nhibernate,criteria,C#,Nhibernate,Criteria,我需要使用CriteriaAPI复制以下正在工作的HQL查询 session.CreateQuery( "select c " + "from Parent p " + "inner join p.Children c " + "where p.Id = 9 " + "and c.Id = 33") .SetMaxResults(3) .List(); 查询选择满足某个条件的所有子项,这些子项属于满足另一个条件的父项。 在我的例子中,两个

我需要使用CriteriaAPI复制以下正在工作的HQL查询

session.CreateQuery(
    "select c " +
    "from Parent p " +
    "inner join p.Children c " +
    "where p.Id = 9 " +
    "and c.Id = 33")
    .SetMaxResults(3)
    .List();
查询选择满足某个条件的所有子项,这些子项属于满足另一个条件的父项。 在我的例子中,两个标准都是简单的Id等式,但它们可以是任何东西

出于某种原因,等效条件API查询返回一个具有正确项数的列表,但这些项数都为空

session.CreateCriteria(typeof (Parent))
    .Add(Restrictions.Eq("Id", 9))
    .CreateCriteria("Children")
    .Add(Restrictions.Eq("Id", 33))
    .SetProjection(Projections.Property("Children"))
    .SetMaxResults(3)
    .List();
为什么这两个查询不返回相同的结果

以下是从HQL查询生成的SQL:

SELECT   TOP 3 childid7_,
               name7_
FROM     (SELECT children1_.childid                 AS childid7_,
                 children1_.name                    AS name7_,
                 Row_number()
                   OVER(ORDER BY current_timestamp) AS __hibernate_sort_row
          FROM   dbo.parent parent0_
                 LEFT OUTER JOIN dbo.child children1_
                   ON parent0_.parentid = children1_.parentid
          WHERE  (parent0_.parentid = 9)
                 AND (children1_.childid = 33)) AS QUERY
WHERE    QUERY.__hibernate_sort_row > 0
ORDER BY QUERY.__hibernate_sort_row 
下面是来自Criteria API查询的SQL:

SELECT   TOP 3 y0_
FROM     (SELECT this_.parentid                     AS y0_,
                 Row_number()
                   OVER(ORDER BY current_timestamp) AS __hibernate_sort_row
          FROM   dbo.parent this_
                 INNER JOIN dbo.child child1_
                   ON this_.parentid = child1_.parentid
          WHERE  this_.parentid = @p0
                 AND child1_.childid = @p1) AS QUERY
WHERE    QUERY.__hibernate_sort_row > 0
ORDER BY QUERY.__hibernate_sort_row 
请注意,父级和子级之间的连接是单向的。子实体没有指向其父实体的引用属性


有人能提出一个替代方案来解决这个限制吗?

看起来您只想要回子对象,所以您需要更改条件以获取子对象的类型,然后使用父id作为选择

session.CreateCriteria(typeof (Child))
.Add(Restrictions.Eq("Id", 33))
.CreateCriteria("Parent")
.Add(Restrictions.Eq("Id", 9))
.SetProjection(Projections.Property("Children"))
.SetMaxResults(3)
.List();

在此处查看“仅查询”属性


这将允许您在查询时使链接看起来是双向的。

为什么在来自条件API的查询中有child1_u2;.childid>@p1?Oops,应该是一个等于。父级和子级之间的连接是单向的。子实体没有指向其父实体的引用属性,因此我无法在此方向遍历关系。这将非常糟糕。。但是你可以将父对象映射到不使用的受保护的属性或私有变量中的子对象上……太好了,我想这正是我想要的。现在希望它也能使用CriteriaAPI工作。