首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从IQueryable<GrandChild>获取时,查询先对父项进行分组,然后对子项进行分组

从IQueryable<GrandChild>获取时,查询先对父项进行分组,然后对子项进行分组
EN

Stack Overflow用户
提问于 2013-02-20 08:51:01
回答 2查看 328关注 0票数 0

让我们假设下面是我们的数据模型。我想要查询玩具,但返回结果,以便我可以执行以下伪代码。

代码语言:javascript
复制
foreach (var parent in parents)
            {
                Console.WriteLine(parent.Name);

                foreach (var child in parent.Children)
                {
                    Console.WriteLine(child.Name);

                    foreach (var toy in child.Toys)
                    {
                        Console.WriteLine(toy.Name);
                    }
                }
            }

数据模型:

代码语言:javascript
复制
public class Parent
{
    public Guid ParentId { get; set; }
    public String Name { get; set; }
    public ICollection<Child> Children { get; set; } 
}
public class Child
{
    public Guid ChildId { get; set; }
    public Guid ParentId { get; set; }
    public Parent Parent { get; set; }
    public String Name { get; set; }
    public ICollection<Toy> Toys { get; set; } 
}
public class Toy
{
    public Guid ToyId { get; set; }
    public Guid ChildId { get; set; }
    public Child Child { get; set; }
    public String Name { get; set; }
    public bool IsCool { get; set; }
}

我尝试过使用grouping来做这件事,但是当我尝试迭代一个grouping时,我看到的都是Key,它没有任何属性,所以我无法获得Parent.Name或Child.Name。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-02-20 17:36:23

您可以执行以下操作:

代码语言:javascript
复制
var query = from p in parents
            from c in p.Children
            from t in c.Toys
            select new { Parent = p.Name, Child = c.Name, Toy = t.Name }

foreach (var a in query)
{
    // write values.
}

实际上,这使用了SelectMany

编辑

在你的评论之后,我认为你正在寻找的不是一个分组。如果你有一个Parent对象,实际上它的Children已经被分组在里面了,因为每个父对象都有自己的集合。但也许您正在寻找一种填充集合的方法?这将通过以下方式完成

代码语言:javascript
复制
var query = from p in parents.Include(x => x.Children.Select(c => c.Toys));
票数 1
EN

Stack Overflow用户

发布于 2013-02-20 09:23:13

LazyLoadingEnabled设置为false时,可以使用一个linq查询加载所有相关对象来完成此操作。

请注意,如果您在儿童或玩具表中有大量相关数据,这可能会导致一些性能问题。

代码语言:javascript
复制
context.ContextOptions.LazyLoadingEnabled = false;

var parents = context.Parents.Select(x=>x).ToList();
foreach(var parent in parents) {
    Console.WriteLine(parent.Name);

    foreach(var child in parent.Children) {
        Console.WriteLine(child.Name);

        foreach(var toy in child.Toys) {
            Console.WriteLine(toy.Name);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14970443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档