如何使用Linq到实体检索分层数据?

时间:2011-01-06 15:17:22

标签: c# asp.net linq-to-entities

我想检索数据并将其显示在已排序的(子项下面的父项)中 这样定义的数据项:ID |标题| Parent-ID

我所做的是首先检索所有项目然后排序 使用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);
            }
        }
    }

更新

如果数据大小很大并且我想使用分页怎么办? 在排序之前我不能Page(.Skip(PageSize * PageIndex).Take(PageSize))...

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

我担心你必须在你的代码中对LINQ结果进行递归。根据表的大小和结构,您可能希望将整个表下拉到内存中(就像您正在做的那样)并在那里执行层次结构。如果您有一个非常大的表,您可能想要重复访问数据库。

有关详细信息,请阅读这篇精彩的文章: Storing Hierarchical Data in a Database

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