2011-01-06 51 views
4

我想要检索数据并将其显示在已排序的子级(父级以下的子级)中。
数据项定义如下:ID |标题|家长ID如何使用Linq-to-entities检索分层数据?

我所做的是首先检索所有项目,然后排序。
linq有没有更好的方法来做到这一点?

protected void Page_Load(object sender, EventArgs e) 
{   
    List<Category> list2 = new List<Category>(); 
    ContModel modeltx = new ContModel(); 

    var ret = modeltx.Categories.ToList(); 

    GetCategoryList(0, 0, ret, list2); 
    string str=""; 

    foreach (Category cat in list2) 
    { 
      str=str+cat.Title+"\n"; 
     TextBox1.Text = str; 
    }  
} 


    private void GetCategoryList(int iCurID, int iDepth, List<Category> li, List<Category> newList) 
    { 
     Category tmp; 
     string strOffset = ""; 

     foreach (Category cat in li) 
     { 
      if ((cat.ParentId) == iCurID) 
      { 
       for (int i = 1; i <= iDepth; i++) 
        strOffset = strOffset + "-"; 

       strOffset = strOffset + cat.Title; 

       tmp = cat; 
       tmp.Title = strOffset; 
       newList.Add(tmp); 

       strOffset = ""; 
       GetCategoryList(cat.CategoryID, iDepth + 1, li, newList); 
      } 
     } 
    } 

更新:

如何做,如果数据的规模是巨大的,我想使用分页?
我不能排序之前页(.Skip(PageSize * PageIndex).Take(PageSize))...

+0

可能的重复http://stackoverflow.com/questions/202912/hierarchical-data-in-linq-options-and-performance – too 2011-01-06 20:18:56

回答

0

恐怕你将不得不缓慢通过LINQ结果在你的代码。根据表格的大小和结构,你可能想把整个表格放入内存(就像你在做的那样),然后在那里进行层次结构。如果您有一张非常大的桌子,您可能需要重复访问数据库。

欲了解更多信息,请阅读这篇大文章:Storing Hierarchical Data in a Database

您的代码已经做了扁平化的记忆。我建议在list2对象(包含展平的数据)上使用Skip(pSize * pIndex).Take(pSize)。请注意,这可能会导致分层结构中的分页符更深。

+0

比方说,我的数据库非常大,我de拉X项目,我做'.OrderBy(p => p.Title).Take(100).ToList();',取100个项目之前,是不是会拉下整个表格? – jullin 2011-01-06 16:26:36

+1

@jullin不,只需要前100个标题。拉整个表,你会做`model.OrderBy(p => p.Title).ToList();`。 – 2011-01-06 16:36:03

1

我鼓励你使用延迟加载技术和这种情况下,你没有加载在你的对象树的每一件事情,直到你需要他们:

class item 
{ 
int id; 
string itemName; 
item partent; 
List<item> _childs; 
public List<item> Childs 
{ 
    get 
{ 
    if(_child == null) 
    _child = getitembyparentid(this.id); 
    return _child; 
} 
} 
} 

类似的东西,在这种情况下,你不不必把所有的行都放到内存中来处理它们。