Asp.net NHibernate-使用具有联接子类的条件排除子类

Asp.net NHibernate-使用具有联接子类的条件排除子类,asp.net,nhibernate,c#-4.0,.net-4.0,fluent-nhibernate,Asp.net,Nhibernate,C# 4.0,.net 4.0,Fluent Nhibernate,我的应用程序中有一个流畅的nhibernate配置。都是最新的。我正在尝试创建一个criteria语句,以在连接的子类层次结构中回调一个特定的类。这是我的继承结构的一个示例: 管理员是员工是个人(管理员:员工,员工:个人) 我想得到的是员工,而不是管理员,但是因为管理员是员工,所以他们会在查询中返回。我没有可使用的鉴别器列。使用CriteriaAPI有什么方法可以实现这一点吗 提前谢谢 所请求的架构(只是一个示例): Person表:Id,Name 员工表:PersonId,EmployeeNu

我的应用程序中有一个流畅的nhibernate配置。都是最新的。我正在尝试创建一个criteria语句,以在连接的子类层次结构中回调一个特定的类。这是我的继承结构的一个示例:

管理员是员工是个人(管理员:员工,员工:个人)

我想得到的是员工,而不是管理员,但是因为管理员是员工,所以他们会在查询中返回。我没有可使用的鉴别器列。使用CriteriaAPI有什么方法可以实现这一点吗

提前谢谢

所请求的架构(只是一个示例):

Person表:Id,Name

员工表:PersonId,EmployeeNumber

管理员:PersonId,AdminNumber


NHibernate正确地关联了这些。除此特定类型的查询外,其他所有查询都正常工作。

条件似乎不支持该功能。我通过向查询添加SQL限制来过滤子类结果,从而解决了这个问题

criteria.Add(
    Expression.SQL("{alias}.MyPrimaryKey NOT IN (SELECT MyPrimaryKey FROM Admin)"));
这从本质上排除了Employee SQL查询,该查询中的Employee存在于Admin表中,因此只返回非管理员的Employee


我最初尝试通过条件单独查询Admin表,以获取ID列表,然后使用NOT IN CRITIAL语句
Restrictions.NOT(Restrictions.IN())将ID列表输入到Employee查询中
但是SQL Server将参数数量限制为2100,如果您试图排除的ID集合包含的项超过2100项,则会爆炸。

如果您没有使用鉴别器类型列,那么NHibernate应该如何区分不同的人员类型呢,它知道不同的类属于不同的表,因此您可能认为Criteria API将通过生成的SQL查询支持这种排除。您能用您的模式更新您的问题吗?感谢您包含该模式。你看过NHibernate输出的SQL了吗?我想这会给你一个线索,为什么你没有得到你期望的结果。