所以我在SQL-Server数据库中有一个树结构。每个节点通过名为prev的外键链接到其父节点到另一个节点。
每当我获取一个节点时,我都希望获取通向树根的所有节点。目前我可以这样做:
MyDataContext db = new MyDataContext();
IList<Node> nodes = new List<Node>();
Node node = db.Nodes.Single(x => x.id == 14);
nodes.Add(node);
while (node.prev != null)
{
node = db.Nodes.Single(x => x.id == node.prev);
nodes.Add(node);
}
但这需要大量的查询等于树的深度。我对linq-to-sql有点新,所以我不知道如何告诉它像这样递归获取。有可能吗?
答案 0 :(得分:2)
我认为你可以使用DataLoadOptions中的一些来实现..
答案 1 :(得分:1)
对于树结构,您要求的可能超出LINQ。有LoadWith
,但这可以通过尝试添加JOIN
等来实现;这不适用于树。
我希望在这种情况下,调用UDF将是一个不错的选择(将有趣的代码移动到数据库)。如何走树取决于您的版本等和确切的SQL服务器版本。例如:
CREATE FUNCTION GetWithAncestors(@id int)
RETURNS @result TABLE (id int null, prev int null, name varchar(100) not null)
AS
BEGIN
;
WITH fn (id, prev, name)
AS (
SELECT tt.id, tt.prev, tt.name, 0
FROM TreeTest tt
WHERE tt.id = @id
UNION ALL
SELECT tt.id, tt.prev, tt.name
FROM fn
INNER JOIN TreeTest tt
ON tt.id = fn.prev
)
INSERT @result
SELECT * FROM fn
RETURN
END
GO
现在可以将UDF添加到您的数据上下文等