【问题标题】:How to retrieve hierarchical data using Linq-to-entities?如何使用 Linq-to-entities 检索分层数据?
【发布时间】:2011-01-06 15:17:21
【问题描述】:

我想检索数据并按排序方式显示(子项低于其父项)。
数据项定义如下: 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, 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)) ...

【问题讨论】:

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


【解决方案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;
}
}
}

类似的东西,在这种情况下,您不必将所有行都放入内存来处理它们。

【讨论】:

  • 我要求得到所有孩子的所有物品
【解决方案2】:

恐怕您将不得不对代码中的 LINQ 结果进行递归。根据表的大小和结构,您可能希望将整个表拉入内存(就像您正在做的那样)并在那里进行层次结构。如果您有一个非常大的表,您可能需要重复访问数据库。

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

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

【讨论】:

  • 假设我的数据库非常大,我嘲笑拉 X 项,我做 '.OrderBy(p => p.Title).Take(100).ToList();',之前拿了 100 件东西,是不是把整张桌子都拉下来了?
  • @jullin 不,那只需要前 100 个标题。要拉整张桌子,你会做model.OrderBy(p =&gt; p.Title).ToList();
  • @C.罗斯,请参考我的更新:我该如何处理分页? (我必须先排序,然后再分页)使用 linq。
  • @jullin,您需要对 list2 对象(扁平列表)进行分页。您可以对数据库进行分页,因为您必须将其全部拉出以构建层次结构,然后是扁平化列表。查看我的更新。
  • 你能解释一下什么是“层次结构深处的分页符”吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2010-10-24
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多