2014-03-26 51 views
2

我正在尋找一種方法來獲取通用結果集,並使用jQuery Dyantree將其轉換爲具有ASP.NET MVC的樹結構。我有一個測試類,如:使用遞歸屬性ASP.NET/C#

public class GenericResults 
{ 
    public string ClaimId { get; set; } 
    public string DrugName { get; set; } 
    public int PatientId { get; set; } 

    //simulates database call, this could be any type of result set 
    public static List<GenericResults> MockDatabaseCall() 
    { 
     return new List<GenericResults>() 
     { 
      new GenericResults { ClaimId = "abc", DrugName="Drug 1", PatientId=1 }, 
      new GenericResults { ClaimId = "bcd", DrugName="Drug 2", PatientId=1 }, 
      new GenericResults { ClaimId = "def", DrugName="Drug 3", PatientId=1 }, 
      new GenericResults { ClaimId = "fgi", DrugName="Drug 4", PatientId=1 }, 
      new GenericResults { ClaimId = "ijk", DrugName="Drug 5", PatientId=2 }, 
      new GenericResults { ClaimId = "klm", DrugName="Drug 6", PatientId=2 }, 
      new GenericResults { ClaimId = "mno", DrugName="Drug 7", PatientId=2 }, 
      new GenericResults { ClaimId = "pqr", DrugName="Drug 8", PatientId=2 }, 
      new GenericResults { ClaimId = "qrs", DrugName="Drug 9", PatientId=2 }, 
      new GenericResults { ClaimId = "stu", DrugName="Drug 10", PatientId=2 }, 
     }; 
    } 
} 

的數據需要在Dynatree的結構是這樣的:

public string Title { get; set; } 
public List<TreeView> Children { get; set; } 
public bool IsFolder 
{ 
    get 
    { 
     return this.Children.Count > 0; 
    } 
} 

在這個例子中,我們真的不需要ClaimId財產,但我想重用已經寫入的存儲過程以供給樹,所以我想包含它。我需要將什麼組合成爲它自己的TreeView對象,並且Children屬性是所有具有分組內容值的記錄。到目前爲止,MockDatabaseCallMethod,如果我分組在PatientId我需要兩個TreeView對象:每個唯一PatientId一個。我希望能夠遞歸地做到這一點,但不知道如何,因爲一些項目將離開(沒有孩子),那很好。這裏是我的嘗試:

public class TreeView 
{ 
    public string Title 
    { 
     get; 
     set; 
    } 

    public List<TreeView> Children { get; set; } 

    public bool IsFolder 
    { 
     get 
     { 
      return this.Children.Count > 0; 
     } 
    } 

    //made void for the time being to limit compilation errors 
    public static void ListToTree(string displayName,string groupedOn) 
    { 
     //seed data 
     List<GenericResults> results = GenericResults.MockDatabaseCall(); 

     //"group" on the property passed by the user 
     var query = results.Select(x => x.GetType().GetProperty(groupedOn).GetValue(x,null)).Distinct(); 

     foreach (var i in query) 
     { 
      var treeView = new TreeView(); 
      treeView.Title = displayName; 

      //iterate over results, if object has the property value of what's currently being iterated over 
      //create a new TreeView object for it 
      treeView.Children = results.Where(x => x.GetType().GetProperty(groupedOn).GetValue(x, null) == i) 
             .Select(n => new TreeView 
                { 
                 Title = displayName, 
                 Children = x <--no idea what to do here 
                }); 
     } 
    } 
} 

理想情況下,我想一個ToTree擴展方法,但首先我想獲得這方面的一些指針。謝謝:)

+0

這聽起來像你'TreeView'永遠不會明白你超過兩個級別 - 一個級別爲組值,另一個級別爲具有「當前」值的所有項目?如果是這樣,遞歸方法是矯枉過正的。只需使用一個簡單的'results.GroupBy(...)'或類似的項目分組。 – Sphinxxx

回答

0

我不知道如果我理解正確的你,但如果我這樣做,我建議以下解決方案:

- )在TreeView更改屬性public List<TreeView> Children { get; set; }public IEnumerable<GenericResults> Children { get; set; }

- )用下面的替換您void ListToTree(string displayName方法:

public static List<TreeView> ListToTree(string displayName, string groupedOn) 
{ 
    //seed data 
    List<GenericResults> results = GenericResults.MockDatabaseCall(); 

    List<TreeView> trees = new List<TreeView>(); 

    //"group" on the property passed by the user 
    var query = results.Select(x => x.GetType().GetProperty(groupedOn).GetValue(x, null)).Distinct(); 

    foreach (int i in query) 
    { 
     var treeView = new TreeView(); 
     treeView.Title = displayName; 
     treeView.Children = results.Where(x => ((int)x.GetType().GetProperty(groupedOn).GetValue(x, null)) == i); 

     trees.Add(treeView); 
    } 

    return trees; 
} 

我不知道但是,如果我正確;-)

+0

嗨,馬庫斯。我試過你的代碼,並且在'results.Where ...'行中出現錯誤,無法將IEnumerable 轉換爲列表。 – wootscootinboogie

+0

是的,因爲您需要更改屬性(請參閱上面的文本) –

+0

並且?它有用嗎? –