【问题标题】:Complicated NHibernate Criteria With Left Outer Joins?具有左外连接的复杂 NHibernate 标准?
【发布时间】:2012-04-17 22:15:14
【问题描述】:

我对 NHibernate 很陌生。我使用 CreateSQLQuery 编写了这个,但如果可能的话,我想把它移到 NHibernate Criteria 格式。我的查询如下所示:

select parent.ID as Id, ValueA.Total as ValueACount, ValueB.Total as ValueBCount
from ParentTable parent 
left outer join
(
  select count(*) as Total, ID 
  from ChildTable
  where state = 'ValueA' 
  group by ID
) ValueA on ValueA.ID = parent.ID
left outer join
(
  select count(*) as Total, ID
  from ChildTable
  where state = 'ValueB' 
  group by ID
) ValueB on ValueB.ID = parent.ID

我更改了表名/值以对其进行抽象。代码按原样工作,但这是我们在整个解决方案中唯一的查询。我想看看我们能不能摆脱它。

提前感谢所有可以提供帮助的人。如果你想给我一个可以帮助我的非常好的网页的链接,那也很好。我至少会为你点赞:)

我也看到了一些类似的问题。如果您觉得其他一些问题/答案会对我有很大帮助,请随时指出我。

【问题讨论】:

    标签: nhibernate subquery left-join


    【解决方案1】:

    你可以试试 linq fu

    var results = from p in session.Query<Parent>()
                  select new
                  {
                      p.Id,
                      ValueACount = (from c1 in session.Query<Child>() where c1.State == "ValueA" && c1.Parent == p select c1).Count(),
                      ValueBCount = (from c2 in session.Query<Child>() where c2.State == "ValueB" && c2.Parent == p select c2).Count(),
                  };
    

    或使用标准

    var results = session.CreateCriteria<Parent>("p")
        .SetProjection(Projections.ProjectionList()
            .Add(Projections.Property("Id"))
            .Add(Projections.SubQuery(DetachedCriteria.For<Child>()
                .Add(Restrictions.Eq("State", "ValueA") && Restrictions.EqProperty("Parent", "p"))
                .SetProjection(Projections.RowCount())))
            .Add(Projections.SubQuery(DetachedCriteria.For<Child>()
                .Add(Restrictions.Eq("State", "ValueB") && Restrictions.EqProperty("Parent", "p"))
                .SetProjection(Projections.RowCount()))))
        .List();
    

    【讨论】:

    • 我现在正在尝试第二件事。回来好像没有结果。不知道出了什么问题。无论是您的代码错误还是我重新翻译到我的课程中。我的课程与表格不匹配,字段对字段。然后,我制作了一些仅具有必要属性的虚拟类,但无济于事。那没有用。但是,我注意到您的代码有一些东西。您有“Restrictions.EqProperty('Parent', 'p'))。那些不应该是属性名称吗?即“Id”、“Id”?
    • 我假设 id 是类中的一对多关联。您可以发布课程让我更好地了解。我的代码应该模仿 sql Select id, (select Count(*) from child c1 where c1.parentId == p.id and c1.state = "valueA") from parent p
    • 我认为 EqProperty 正在测试右侧的值是否等于左侧...参数在 NHibernate 元数据中的标题为 lhs 和 rhs...您似乎将它们标记为表名和别名。我是不是误会了?
    • eqproperty 应该等同于EqProperty("Parent.Id", "p.Id")),它比较两个属性,一个对象别名和一个查询
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多