添加条件以通过自引用父级进行筛选?

时间:2009-12-16 22:41:43

标签: c# nhibernate criteria

难倒在这一个上。我为给定的类映射了多对多的自引用关系(FluentNH):

public class Folder
{
    public IList<Folder> ParentFolders{get;set;}
}

我正在寻找一个提取根文件夹的查询(即具有ParentFolders.Count()== 0 的文件夹)。自引用是通过查找表完成的,因此实际上不能从类中访问ParentFolderID(仅显示在映射中)。

public IList<Folder> GetRootFolders()
{
    return session.CreateCriteria<Folder>()
        .outofideas()
        .List<Folder>();
}

非常感谢通过查找表对自引用层次结构的任何帮助或想法。这些表本身是遗留的,因此无法修改。

2 个答案:

答案 0 :(得分:0)

我总是发现NHibernate的Criteria难以使用。 (也就是说 - 甚至更多比NHibernate的其余部分困难。)尝试创建一个HQL查询。在没有看到映射文件的情况下,我无法为您编写查询,但它将类似于:

session.CreateQuery("FROM Folder f WHERE COUNT(f.ParentFolders) = 0")

你必须稍微使用语法,我是从内存中写的。请注意,NHibernate足够聪明,可以为COUNT执行子查询 - 它实际上不会加载所有父文件夹,然后计算它们。

答案 1 :(得分:0)

如果您的映射具有以下内容:

<bag name="ParentFolders" table="FolderFolder" lazy="true">
    <key column="FolderID"/>
    <many-to-many class="Folder" column="ParentFolderID"/>
</bag>

然后如果你写:

var folders = Session.CreateCriteria<Folder>("folder")
    .Add(Restrictions.IsEmpty("ParentFolders")).List<Folder>();

你会得到这个SQL:

SELECT *
FROM Folder folder 
WHERE not exists (select 1 from FolderFolder where folder.FolderID=FolderID)

我相信这就是诀窍。