代码之家  ›  专栏  ›  技术社区  ›  Craig

NHiberonate icriteria连接条件

  •  4
  • Craig  · 技术社区  · 15 年前

    我正在尝试使用icriteria创建具有联接的查询 条件。我尝试生成的SQL应该如下所示

    SELECT c.ClientID
    FROM Client c
    LEFT OUTER JOIN ClientContact t on c.ClientID = t.ClientID AND
    t.ContactType = 'Email'
    

    如果我使用这样的标准

    m_ClientRepository.QueryAlias("client")
         .CreateCriteria("client.Contacts", "c", JoinType.LeftOuterJoin)
         .Add(Restrictions.Eq("c.ContactType", ContactType.Email));
    

    它将生成我不想要的SQL。

    SELECT c.ClientID
    FROM Client c
    LEFT OUTER JOIN ClientContact t on c.ClientID = t.ClientID
    WHERE t.ContactType = 'Email'
    

    如果不能使用icriteria,是否有必要使用icriteria或hql?

    编辑:我发现NHibernate 2.1(我正在使用)现在可以了 allow this . 不过,对icriteria不太确定,这是我的偏好。

    5 回复  |  直到 13 年前
        1
  •  3
  •   Stefan Steinegger    13 年前

    我不会这么做的。左边的外部连接允许nh加载客户端,电子邮件联系人的筛选器将只加载电子邮件联系人…直到它初始化联系人集合并加载所有内容。

    如果它只加载电子邮件联系人,那么它最终会出现在内存中不完整的对象中。这通常不是一个好主意,尤其是在同一事务中更改数据时。

    在您的情况下,我会尝试直接加载电子邮件联系人,并从联系人导航到客户。

    session.CreateCriteria(typeof(Contact))
         .Add(Restrictions.Eq("c.ContactType", ContactType.Email));
    
        2
  •  1
  •   Michael Sagalovich    13 年前

    如果你找不到正确的方法 join 你可以做一个简单的技巧:让你的限制 WHERE t.ContactType = 'Email' OR t.ClientID IS NULL -希望,使用NHiberinate是可能的。

        3
  •  1
  •   Craig    13 年前

    我已经找到了唯一的方法来做这与NHibernate 3和以前是通过过滤器,如 this example

    在NHibernate 3.1中,这一点现在得到了更好的支持, https://nhibernate.jira.com/browse/NH-2190

        4
  •  0
  •   Nikolay R    15 年前

    可以将iquery与isqlquery结合使用。这不是一个标准机制,但它可能对您有所帮助。

        5
  •  0
  •   Baz1nga    13 年前
    from s in Session.Linq<Client> left join cc in c.Contacts
            on
            new { c.ClientID , cc.ClientID }
            equals
             new { cc.ContactType, "Email" }
            select c.ClientId;
    

    如果你用的是NHIBERNATE 2,希望它能起作用。