2013-05-01 43 views
5

Đây là lần đầu tiên tôi nghe về LINQ và tôi không có ý tưởng về nó. Xin hãy nhẹ nhàng với tôi.Lấy hồ sơ trẻ em bằng cách sử dụng LINQ

Tôi có bộ dữ liệu này.

+---------+--------+---------------+ 
| 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 |    | 
+---------+--------+---------------+ 

Điều tôi cần làm là viết phương thức trả về danh sách NodeID. ví dụ:

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

Kết quả mong đợi của tôi là NodeID: 2 and 11.

NodeID = 2 được bao gồm vì có RadioID = R7 được kết nối với RadioID = R0 thuộc về NodeID = 1.

NodeID = 11 cũng được bao gồm vì RadioID = R11 được kết nối với Radio = R9 thuộc NodeID = 2 (mà cũng được kết nối với NodeID = 1).

tôi tra cứu bài viết này nhưng tôi luôn có được StackOverFlowException

Dưới đây là đoạn code đầy đủ:

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; 
    } 

} 

Bạn có thể gợi ý nếu có cách tốt hơn để làm điều đó . Xin lỗi Newbie ở đây.

Trả lời

2

Nếu bạn là người mới không quá thông minh với đệ quy và lambdas.

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(); 
    } 

CẬP NHẬT 1

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

làm thế nào là nhận được trẻ em trẻ em? –

+0

Làm cách nào để bỏ phiếu cho anh chàng này vì lợi ích tốt hơn? –

+1

chỉ cần thư giãn, downvotes không phải là một cuộc tấn công cá nhân, họ không có nghĩa là bất cứ điều gì khác hơn là câu trả lời đưa ra là không chính xác và không trả lời câu hỏi. –

Các vấn đề liên quan