【发布时间】:2010-09-29 18:23:53
【问题描述】:
似乎在使用以下NHibernate查询时,当左外连接没有记录时,我没有得到根实体。
ICriteria critera = session.CreateCriteria(typeof(Entity));
criteria.CreateCriteria("SubTable.Property", "Property", NHibernate.SqlCommand.JoinType.LeftOuterJoin);
criteria.Add(Expression.Not(Expression.Eq("Property", value)));
我试图生成的 SQL 是:
SELECT * FROM BaseTable
LEFT JOIN (
SELECT * FROM SubTable
WHERE Property <> value
)Sub ON Sub.ForeignKey = BaseTable.PrimaryKey
请注意 where 子句位于左连接的 select 语句中。这样,如果没有任何匹配的子记录,我们仍然可以获得顶级记录。似乎 NHibernate 正在生成以下 SQL。
SELECT * FROM BaseTable
LEFT JOIN (
SELECT * FROM SubTable
)Sub ON Sub.ForeignKey = BaseTable.PrimaryKey
WHERE Sub.Property <> value
有没有办法实现第一段 SQL?我已经试过了:
ICriteria critera = session.CreateCriteria(typeof(Entity));
criteria.CreateCriteria("SubTable.Property", "Property", NHibernate.SqlCommand.JoinType.LeftOuterJoin);
criteria.Add(
Restrictions.Disjunction()
.Add(Expression.IsNull("Property"))
.Add(Expression.Not(Expression.Eq("Property", value)));
我正在寻找使用 Criteria API 的解决方案。
【问题讨论】:
-
你可以看看 nhibernate 日志文件,看看发出了什么 sql 语句。
标签: asp.net sql nhibernate