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

本文关键字:NHibernate 标准 引擎 查询 连接 | 更新日期: 2023-09-27 18:12:28

是否有可能在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

嗨。活动id = 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();

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

可能不是你想要的答案,如果不是,我很抱歉,但我的经验是,对于这种复杂的查询,你最好的选择是:

a)将整个东西作为视图并映射到NHibernate

b)创建内部选择作为一个视图,并创建一个映射,这样你就可以在你的查询

b)或者重写nhibernate(重写为跳过而不是OO术语),并使用本地SQL将其写入命名查询。

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

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