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

发布于 2025-01-05 08:51:21 字数 1070 浏览 1 评论 0原文

我正在使用嵌套集模型,希望能够选择 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();

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

因此,我如何使用 Linq 语句获取每个父节点的 10 个子节点,而不是使用 foreach(我当前正在执行的操作)循环访问parentItems 并在每次迭代时对数据库进行 10 或 (pageSize) 调用?

编辑:

我正在使用嵌套集模型。我的项目有左侧和右侧位置(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 数量的子级?

任何帮助表示赞赏

I am using a nested set model and want to be able to select 10 parent items, as well as 10 child items for each parent, which are ordered.

I am trying to write a nested comment system, whereby a reply to a comment will be signified by having left and right values within its 'parent' comment.

I am having a real headache reducing the load times of large lists of items being retrieved and believe if I could do the above in a single Linq statement then I might be able to save a lot more time than making repeated calls to the db to get 10 children for each parent.

I use a this statement to get the parent(or root items) from the 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();

The above code is getting the outermost (parent) items in the nested set model by checking there are not any other items with left and right values outside of theirs.

So, rather than looping through the parentItems with a foreach (which I am doing currently) and making 10 or (pageSize) calls to the db on each iteration, how can I take 10 children of each parent node with a Linq statement?

EDIT:

I am using the nested set model. My items have left and right positions (leftPos and rightPos). So a child is an object with left and right values within the left and right values of another object, which in turn would be the parent.

1 a 4
  2 b 3

so if I have a lot of items

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

....

Is there a way I can select x amount of children from each parent using Linq?

Any help appreciated

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

阿楠 2025-01-12 08:51:21
    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 属性访问父项目...

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

not sure if this is what you want. this way you get a collection of subitems. 10 subitems of each parent. you can access the parents with the .Parent property of each subitem...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文