具有内连接和子查询的NHibernate Criteria引擎

时间:2011-10-27 09:18:12

标签: c# nhibernate criteria

在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看起来像这样。 下面的条件显示了我使用的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();

2 个答案:

答案 0 :(得分:0)

可能不是您正在寻找的答案,如果不是,请道歉,但我的经验是,您最好的选择是这样复杂的问题:

a)将整个事物作为一个视图并在NHibernate中映射

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

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

答案 1 :(得分:0)

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

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