2013-05-01 2 views
5

이것은 내 첫번에 LINQ에 관한 소식입니다. 제발 친절 해주세요.Linq를 사용하여 자식 레코드를 얻으십시오

이 데이터 세트가 있습니다. 내가해야 할 일은

+---------+--------+---------------+ 
| RadioID | NodeID | SourceRadioID | 
+---------+--------+---------------+ 
| R0  |  1 |    | 
| R1  |  1 |    | 
| R2  |  1 |    | 
| R3  |  1 |    | 
| R4  |  1 |    | 
| R5  |  2 |    | 
| R6  |  2 |    | 
| R7  |  2 | R0   | 
| R8  |  2 |    | 
| R9  |  2 |    | 
| R10  |  11 |    | 
| R11  |  11 | R9   | 
| R12  |  11 |    | 
| R13  |  11 |    | 
+---------+--------+---------------+ 

NodeID의 목록을 반환하는 방법을 작성하는 것입니다. 예 :

List<int> dependentNode = GetChildNode(1); // int ParentNode 

예상되는 결과는 노드 ID : 2 and 11입니다.

NodeID = 2NodeID = 1에 속하는 RadioID = R0에 연결된 RadioID = R7이 있기 때문에 포함됩니다. RadioID = R11NodeID = 2이 속하는 Radio = R9 (도 NodeID = 1 접속된다 )으로 연결되어 있기 때문에

NodeID = 11도 포함된다.

이 기사를 조회하지만 난 항상 StackOverFlowException

를 얻을 여기에 전체 코드입니다 :

public class RadioEntity 
{ 
    public string RadioID { get; set; } 
    public int NodeID { get; set; } 
    public string SourceRadioID { get; set; } 
} 

public class SampleDemo 
{ 
    public void SampleMethod() 
    { 

     Func<int, int,List<int>> GetChildNode = null; 
     GetChildNode = (x, y) => 
      { 
       return (from _x in GetRadio() 
         where (GetRadio().Where(i => i.NodeID == x).Select(i => i.RadioID)).Contains(_x.RadioID) 
         from _y in new[] { _x.NodeID }.Union(GetChildNode(_x.NodeID, y + 1)) 
         select _y).ToList<int>(); 
      }; 

     var _res = GetChildNode(1, 0); 

    } 

    public List<RadioEntity> GetRadio() 
    { 
     List<RadioEntity> _returnVal = new List<RadioEntity>(); 
     _returnVal.Add(new RadioEntity() { RadioID = "R0", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R1", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R2", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R3", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R4", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R5", NodeID = 2, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R6", NodeID = 2, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R7", NodeID = 2, SourceRadioID = "R0" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R8", NodeID = 2, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R9", NodeID = 2, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R10", NodeID = 11, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R11", NodeID = 11, SourceRadioID = "R9" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R12", NodeID = 11, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R13", NodeID = 11, SourceRadioID = "" }); 

     return _returnVal; 
    } 

} 

그것을 할 수있는 더 나은 방법이 있는지 당신이 제안 할 수 있습니다 . 미안 새내 여기.

답변

2

초보자의 경우 재귀 및 람다를 너무 능숙하게 사용하지 마십시오.

public List<int> GetChildren(int id) 
    { 
     var nodes = GetRadio(); 
     var parent = nodes.Single(n => n.NodeID == id); 
     var children = nodes.Where(n => n.SourceRadioID == parent.RadioID).Select(n => n.NodeID); 

     return children.Union(children.SelectMany(GetChildren)).ToList(); 
    } 

UPDATE

public List<int> GetChildren(int id) 
{ 
    IEnumerable<RadioEntity> parent = GetRadio().Where(x => x.NodeID == id); 
    IEnumerable<int> children = (
            from r in GetRadio() 
            where parent.Select(x=>x.RadioID) 
               .Contains(r.SourceRadioID) 
            select r 
           ).Select(n => n.NodeID); 

    return children.Union(children.SelectMany(GetChildren)).ToList(); 
} 
+0

어떻게이 아이의 아이를 점점 하나? –

+0

좋은 사람을 위해이 사람을 어떻게 투표합니까? –

+1

그냥 휴식, downvotes는 개인적인 공격이 아니며, 주어진 답변 이외의 다른 의미가 아니라 정확하고 질문에 대답하지 않습니다. –

관련 문제