Как получить иерархические данные, используя Linq-to-entity? - PullRequest
4 голосов
/ 06 января 2011

Я хочу получить данные и отобразить их отсортированными (дочерний элемент ниже его родителя).
Элементы данных определены следующим образом: 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 ]

1 голос
/ 06 января 2011

Я рекомендую вам использовать ленивые методы загрузки, и в этом случае вам не нужно загружать каждую вещь в вашем дереве объектов, пока они вам не понадобятся:

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;
}
}
}

что-то в этом роде, и в этом случае выне нужно переносить все строки в память для их обработки.

0 голосов
/ 06 января 2011

Боюсь, вам придется пересмотреть результаты LINQ в вашем коде. В зависимости от размера и структуры таблицы, вы можете захотеть вытащить всю таблицу в память (как вам кажется) и пройтись по иерархии. Если у вас очень большая таблица, вы можете совершать повторные поездки в БД.

Для получения дополнительной информации прочитайте эту замечательную статью: Хранение иерархических данных в базе данных

Ваш код уже выполняет выравнивание в памяти. Я бы предложил использовать Skip(pSize * pIndex).Take(pSize) на вашем list2 объекте (который содержит сведенные) данные. Помните, что это может привести к разрыву страниц в глубине иерархии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...