首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nHibernate ICriteria联接条件

nHibernate ICriteria联接条件
EN

Stack Overflow用户
提问于 2009-08-24 22:45:34
回答 5查看 7.7K关注 0票数 4

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

代码语言:javascript
复制
SELECT c.ClientID
FROM Client c
LEFT OUTER JOIN ClientContact t on c.ClientID = t.ClientID AND
t.ContactType = 'Email'

如果我使用像这样的标准

代码语言:javascript
复制
m_ClientRepository.QueryAlias("client")
     .CreateCriteria("client.Contacts", "c", JoinType.LeftOuterJoin)
     .Add(Restrictions.Eq("c.ContactType", ContactType.Email));

它将生成我不想要的sql。

代码语言:javascript
复制
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不太确定,但这是我的偏好。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-01 06:59:09

我发现在NHibernate 3及之前版本中,唯一的方法就是像在this example中那样使用过滤器

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

票数 1
EN

Stack Overflow用户

发布于 2011-08-29 15:06:29

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

如果它只加载E-Mail联系人,那么它将在内存中以不完整的对象结束。这通常不是一个好主意,特别是当您还在同一事务中更改数据时。

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

代码语言:javascript
复制
session.CreateCriteria(typeof(Contact))
     .Add(Restrictions.Eq("c.ContactType", ContactType.Email));
票数 3
EN

Stack Overflow用户

发布于 2011-08-29 14:36:24

如果您找不到一种方法来形成正确的join,您可以使用一个简单的技巧:只需将您的限制设置为WHERE t.ContactType = 'Email' OR t.ClientID IS NULL -希望可以使用NHibernate。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1325188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档