难倒在这一个上。我为给定的类映射了多对多的自引用关系(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>();
}
非常感谢通过查找表对自引用层次结构的任何帮助或想法。这些表本身是遗留的,因此无法修改。
答案 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)
我相信这就是诀窍。