Linq-to-sql:如何主动抓取链接对象?

时间:2009-12-14 00:07:03

标签: c# sql-server linq-to-sql

所以我在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有点新,所以我不知道如何告诉它像这样递归获取。有可能吗?

2 个答案:

答案 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添加到您的数据上下文等