我有一个表格,其中包含我正在使用 NHibernate 从我的网络应用程序中查询的分层数据。这很简单
CREATE TABLE [dbo].[Relationships](
[RelationshipId] [uniqueidentifier] NOT NULL,
[ParentId] [uniqueidentifier] NULL,
[ParentTypeId] [uniqueidentifier] NULL,
[ChildId] [uniqueidentifier] NOT NULL,
[ChildTypeId] [uniqueidentifier] NOT NULL
)
现在要从该表中查询信息,我使用的是 SQL Server(自 2005 年以来)的一项功能,称为 Common Table Expressions,或简称为 CTE。它让我可以编写递归查询,这对于上面的表格非常有用。
WITH Ancestors(RelationshipId, ParentId, ChildId)
AS
(
SELECT r.RelationshipId, r.ParentId, r.ChildId
FROM Relationships r
WHERE ChildId = :objectId
UNION ALL
SELECT r.RelationshipId, r.ParentId, r.ChildId
FROM Relationships r
INNER JOIN Ancestors
ON Ancestors.ParentId = r.ChildId
)
SELECT RelationshipId, ParentId, ChildId FROM Ancestors
现在,这很好,性能也不错,但是当我尝试使用它来确定上树的祖先,或者更糟糕的是,使用类似的查询来确定后代时,它可能会很费力。
现在我想简单地缓存这个查询的结果,但是Index was outside the bounds of the array.
如果我有.SetCacheable(true)
. 如果我删除缓存支持,查询工作正常。
如果我从对Session.CreateSQLQuery()
Now 的调用中删除缓存支持,则查询工作正常。
因此,虽然我很好奇为什么它不起作用,但我更感兴趣的是找到一种解决方法来让缓存与我在 nHibernate 中的 CTE 一起工作?