Linq выбрать 10 детей для каждого родительского элемента - PullRequest
0 голосов
/ 14 февраля 2012

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

Я пытаюсь написать систему вложенных комментариев, в которой ответ на комментарий будет означать наличие левого и правого значений в своем «родительском» комментарии.

У меня настоящая головная боль, уменьшающая время загрузки больших списков извлекаемых элементов, и я верю, что если бы я мог сделать вышеупомянутое в одном операторе Linq, я мог бы сэкономить гораздо больше времени, чем повторные вызовы дБ, чтобы получить 10 детей для каждого родителя.

Я использую оператор this для получения родителя (или корневых элементов) из текста данных.

var query = context.Items
                   .Where(x => !context.Items.Any(y => y.LeftPos < x.LeftPos
                                                    && y.RightPos > x.RightPos))
                   .OrderBy(x => x.Id)
                   .Take(pageSize)
                   .ToList();

Приведенный выше код получает самые внешние (родительские) элементы в модели вложенного набора, проверяя, что нет других элементов с левыми и правыми значениями вне их.

Итак, вместо того, чтобы циклически перебирать parentItems с помощью foreach (что я сейчас делаю) и делать 10 или (pageSize) обращений к БД на каждой итерации, как я могу взять 10 дочерних элементов каждого родительского узла с помощью оператора Linq

EDIT:

Я использую модель вложенного множества. Мои предметы имеют левую и правую позиции (leftPos и ​​RightPos). Таким образом, дочерний объект - это объект с левыми и правыми значениями в левом и правом значениях другого объекта, который, в свою очередь, будет родительским.

1 a 4
  2 b 3

так что, если у меня много предметов

1 a 4
 2 b 3
5 c 10
 6 d 7
 8 e 9
11 f 14
 12 g 13

....

Есть ли способ выбрать x количество детей от каждого родителя с помощью Linq?

Любая помощь приветствуется

1 Ответ

2 голосов
/ 14 февраля 2012
    class Program
    {
        static void Main(string[] args)
        {
            List<A> lst = new List<A>();

            for (int j = 1; j < 4; j++)
            {
                var tmp = new A() { Value = j * 1000 };
                for (int i = 0; i < 150; i++)
                {
                    tmp.SubItems.Add(new B { Value = i + 1, Parent = tmp });
                }
                lst.Add(tmp);
            }

            List<B> result = lst.SelectMany(x => x.SubItems.Take(10)).ToList();
        }
    }

    public class A
    {
        public A()
        {
            SubItems = new List<B>();
        }

        public int Value { get; set; }
        public List<B> SubItems { get; set; }
    }


    public class B
    {
        public int Value { get; set; }
        public A Parent { get; set; }
    }

не уверен, что это то, что вы хотите. Таким образом, вы получите коллекцию подпунктов. 10 подпунктов каждого родителя. Вы можете получить доступ к родителям с помощью свойства .Parent каждого подпункта ...

...