微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何使用Linq-to-entities检索分层数据?

我想检索数据,并将其显示在有条件的(子项下面的子项)中.
这样定义的数据项:ID |标题|家长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,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))

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐