【问题标题】:NHibernate Criteria engine with inner join and subquery具有内部连接和子查询的 NHibernate Criteria 引擎
【发布时间】:2011-12-16 08:49:50
【问题描述】:

在 NHibernate 中是否可以创建如下所示的查询?

select hi.ContactId
From dbo.vw_HostInterests hi INNER JOIN
    (  Select cm1.ContactId
        From dbo.vw_ContactMoments cm1 INNER JOIN
            (
                Select Contactid
                From dbo.vw_ProfileNaw
                where GenderId = 1000
            ) as pn1 on cm1.ContactId = pn1.ContactId
        where cm1.ActivityId = 1001
    )as cm on hi.ContactId = cm.ContactId

其中 hi.ActivityId = 1038

我已经设法使用 IN 语句创建了正确的输出,但我真的希望 SQL 看起来像这样。 下面的 Criteria 显示了上面查询的一部分以及我使用的 IN 语句(但想替换):

ICriteria criteria = DbSession.CreateCriteria<Contact>();

var dCriteria1 = DetachedCriteria.For(typeof(VwHostInterest))
    .Add(Expression.Eq("ActivityId", 1038))
    .SetProjection(Projections.ProjectionList()
    .Add(Projections.GroupProperty("ContactId")));

var dCriteria2 = DetachedCriteria.For(typeof(VwContactMoment))
    .Add(Expression.Eq("ActivityId", 1001))
    .SetProjection(Projections.ProjectionList()
    .Add(Projections.GroupProperty("ContactId")));

criteria.Add(Subqueries.PropertyIn("ContactId", dCriteria1));
criteria.Add(Subqueries.PropertyIn("ContactId", dCriteria2));

int count = (Int32)criteria
    .SetProjection(Projections.Count("ContactId"))
    .UniqueResult();

【问题讨论】:

    标签: c# nhibernate criteria


    【解决方案1】:

    可能不是您正在寻找的答案,如果不是,我们深表歉意,但我的经验是,对于此类复杂查询,您最好的选择是:

    a) 将整个事情作为一个视图执行并在 NHibernate 中映射它

    b) 将内部选择创建为视图并创建映射,以便您可以在查询中关联它

    b) 或者覆盖 nhibernate(在跳过而不是在 OO 术语中覆盖;)并使用本机 SQL 将其编写为命名查询。

    【讨论】:

      【解决方案2】:

      该嵌套查询是否产生与以下相同的结果?

      SELECT hi.ContactId
      FROM dbo.vw_HostInterests hi 
      INNER JOIN vw_ContactMoments cm1 on hi.ContactId = cm1.ContactId
          AND cm1.ActivityId = 1001
      INNER JOIN dbo.vw_ProfileNaw pn1 on pn1.ContactId = cm1.ContactId
          AND pn1.GenderId = 1000   
      WHERE hi.ActivityId = 1038   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多