Linq为每个父项选择10个孩子

时间:2012-02-14 13:29:00

标签: c# linq foreach children nested-sets

我正在使用嵌套集模型,并希望能够选择10个父项,以及每个父项的10个子项,这些项是有序的。

我正在尝试编写一个嵌套的评论系统,通过在其父母的“父母”中使用左右值来表示对评论的回复。评价。

我真的很头疼,减少了大量检索项目的加载时间,并相信如果我能在单个Linq语句中执行上述操作,那么我可能比重复调用更多时间节省更多时间db为每个父母提供10个孩子。

我使用this语句从datacontext获取父项(或根项)。

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();

上面的代码通过检查没有任何其他项目在他们之外具有左右值来获取嵌套集合模型中的最外层(父)项目。

因此,不是使用foreach(我当前正在执行)循环遍历parentItems,而是在每次迭代时对db进行10或(pageSize)调用,如何使用Linq语句对每个父节点的10个子节点进行调用?

编辑:

我正在使用嵌套集模型。我的项目有左右两个位置(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

...

有没有办法可以使用Linq从每个父母中选择x个孩子?

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:2)

    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属性访问父项...

相关问题