使用ICriteria接口选择NHibernate中不在集合中的对象

使用ICriteria接口选择NHibernate中不在集合中的对象,nhibernate,icriteria,Nhibernate,Icriteria,在我的系统中,用户拥有0个或更多类别。以下是我的模型类的简化版本: public class User { public virtual String Name {get; set;} public virtual IList<Category> Categories { get; set; } } public class Category { public virtual String Title {get; set;} } 公共类用户 { 公共虚拟字

在我的系统中,用户拥有0个或更多类别。以下是我的模型类的简化版本:

public class User
{
    public virtual String Name {get; set;}
    public virtual IList<Category> Categories { get; set; }
}

public class Category
{
    public virtual String Title {get; set;}
}
公共类用户
{
公共虚拟字符串名称{get;set;}
公共虚拟IList类别{get;set;}
}
公共类类别
{
公共虚拟字符串标题{get;set;}
}
现在我想创建一个ICriteria查询来选择所有未分配给用户的类别,但我被卡住了。理想情况下,我不想创建一个从类别到用户的导航属性,但凭借我对NHibernate的初级知识,这是我能看到的唯一解决方案

是否有ICriteria查询可以对当前的数据模型类执行此操作


谢谢你的帮助。

这是我不知道的,但可能是一个有用的指针

var crit = _session.CreateCriteria<Category>("c")
                      .Add(
                        Subqueries.PropertyNotIn("c.id",
                            DetachedCriteria.For<User>("u")
                                .CreateCriteria("Categories","uc")
                                .SetProjection(Projections.Property("uc.id"))                                    
                        ));
var unassignedCategories = crit.List<Category>();
希望这有帮助,很抱歉我无法测试:)


托宾

假设一个类别只能由一个用户拥有是否安全?假设Category表在数据库级别具有用户表的外键是否安全?类别仅由一个用户拥有,并且Category表包含用户的外键。
select c.* from categories where c.id not in (select uc.id from usercategories)