【问题标题】:nHibernate ICriteria Join ConditionnHibernate ICriteria 加入条件
【发布时间】:2011-09-01 06:59:09
【问题描述】:

我正在尝试使用 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,但这是我的偏好。

【问题讨论】:

  • 我在 Criteria 中寻找完全相同的东西。我们需要 with 表达式。
  • 不是一个 sql 专家,但为什么你想要第一个选项而不是第二个选项,他们给出的结果不一样吗?
  • 嗨 Colin,他们给出的结果不同。
  • @Colin 它们与INNER JOIN 相同(或只是JOIN,相同)。使用LEFT OUTER(或LEFT),结果可能会有所不同。
  • 哥们,你是不是忘了接受某个答案,或者两个都不接受?

标签: c# .net nhibernate


【解决方案1】:

我不会这样做。无论如何,左外连接让我们 NH 加载客户端,电子邮件联系人的过滤器将仅加载电子邮件联系人......直到它初始化联系人集合并加载所有内容。

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

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

session.CreateCriteria(typeof(Contact))
     .Add(Restrictions.Eq("c.ContactType", ContactType.Email));

【讨论】:

    【解决方案2】:

    如果您找不到正确的join 格式,您可以做一个简单的技巧:只需将您的限制设置为WHERE t.ContactType = 'Email' OR t.ClientID IS NULL - 希望NHibernate 可以实现。

    【讨论】:

    • 如果您使用此解决方法,您需要将联接更改为内部联接。
    • @Jamie 没有。现在是LEFT JOIN,已经足够了。
    【解决方案3】:

    我发现使用 NHibernate 3 及之前的版本执行此操作的唯一方法是通过 this example 中的过滤器

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

    【讨论】:

      【解决方案4】:

      您可以将 IQuery 与 ISQLQuery 结合使用。这不是标准机制,但它可能会对您有所帮助。

      【讨论】:

        【解决方案5】:
        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,希望这可以工作

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多