2010-03-23 178 views

回答

4

也許是這樣的:

var query = from node in nested_category 
      from parentNode in nested_category 
      where node.lft >= parentNode.lft && node.rgt <= parentNode.rgt 
       && node.name == "FLASH" 
      orderby parent.left 
      select parent.name; 
+0

謝謝,我會做一些測試。一目瞭然,看起來不錯。不知道爲什麼我不認爲只有2個發言。 :D – Chaddeus 2010-03-23 12:22:09

+0

@Thomas - 這很有用,謝謝! – Chaddeus 2010-03-23 22:48:31

1

如果你做左外連接類似的(即不使用DefaultIfEmpty()),那麼頂級父節點將不會被輸出(因爲它的父母是NULL)

我的SQL版本去:

SELECT 
    B.ELEMENT_CODE ParentElement, 
    A.ELEMENT_CODE ChildElement 
FROM NESTED_SET_STRUCTURE AS A 
LEFT OUTER JOIN NESTED_SET_STRUCTURE AS B 
    ON B.PROCEDURE = 'TEST1' AND B.FROM_LEFT = (SELECT MAX(C.FROM_LEFT) 
      FROM NESTED_SET_STRUCTURE AS C 
      WHERE C.PROCEDURE = 'TEST1' AND A.FROM_LEFT > C.FROM_LEFT 
       AND A.FROM_LEFT < C.TO_RIGHT) 
WHERE 
    A.PROCEDURE = 'TEST1'; 

翻譯爲:

var nestedSets1 = 
    from a in NESTED_SET_STRUCTUREs 
    join b in NESTED_SET_STRUCTUREs on 
    new { a.PROCEDURE, FROM_LEFT = ((from c in NESTED_SET_STRUCTUREs 
     where c.PROCEDURE.Equals("TEST1") 
     && a.FROM_LEFT > c.FROM_LEFT 
     && a.FROM_LEFT < c.TO_RIGHT 
     select (c.FROM_LEFT)).Max()) } equals 
    new { b.PROCEDURE, b.FROM_LEFT } into bo 
    from bb in bo.DefaultIfEmpty() 
    where 
     a.PROCEDURE.Equals("TEST1") 
    orderby a.FROM_LEFT 
    select new { 
     ParentElement = bb.ELEMENT_CODE, 
     ChildElement = a.ELEMENT_CODE 
    }; 

希望幫助,保羅。