选择具有唯一 linq 查询的所有相关实体 [重复]

Posted

技术标签:

【中文标题】选择具有唯一 linq 查询的所有相关实体 [重复]【英文标题】:select the all related entity with the only linq query [duplicate] 【发布时间】:2013-02-15 14:42:30 【问题描述】:

我有一个与自身有关系的类别表。那就是它是一个树层次视图,例如:oldfather_category -> Father_category -> child_category。

所以我需要在这张桌子上建立树状视图。我需要它的所有行。起初我这样做:

    IEnumerable<Category> list = _service.Get().Where(c => c.ParentID == null);
    Node(list);

当我像这样使用递归时:

    private void Node(IEnumerable<Category> list)
    
        foreach (Category c in list)
        
            //if has childs
            if (c.Category1.Count > 0)
                Node(c.Category1);
        
    

每当我调用 c.Category1.Count 属性(延迟执行魔法)时,实体框架都会构建选择。但是我想在第一条语句中加载所有实体,我想对 sql server 进行唯一的选择。我怎样才能做到这一点?我希望问题很清楚)

已编辑:当我使用 ToList() 时,Category1 属性为空

【问题讨论】:

我认为您可以使用_service.Get().Include("Category1").Where.....,它会将其包含在第一个查询中,尽管我可能弄错了。 @Alxandr 是的,它有效,谢谢 【参考方案1】:

如果不在数据库服务器上编写函数来循环遍历所有子节点,就不可能加载树中的所有元素。

但是,根据您需要运行的实际查询,您可能能够破解一些有效的东西。如果特定元素将始终是任何树的根,您可以将每个元素的第三个引用添加到树的根,然后在内存中构建实际的树。例如,在博客上的 cmets 的情况下,博客帖子 ID 可能始终是树的根,然后每个评论仍然具有它所响应的父级。为每个元素添加一个根标识符并对其进行查询,然后在内存中递归地构建树。​​

如果您的查询的根并不总是这种预定义类型的元素,您最好为您的服务器编写一个函数来处理这种情况。但是,您将无法使用实体框架进行此查询。

【讨论】:

以上是关于选择具有唯一 linq 查询的所有相关实体 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 选择单个列表的所有唯一组合,不重复

实体框架 LINQ - 具有分组依据的子查询

Linq 查询排除相关实体为空

LINQ:如何选择唯一行:具有多列的 max(id)?

与 LINQ 的类的属性不同 [重复]

通过 linq 对实体查询进行分组,以通过加入表来获取具有最新时间戳的一条记录