【问题标题】:Entity Framework Self Join [duplicate]实体框架自加入 [重复]
【发布时间】:2014-12-16 05:01:46
【问题描述】:

我正在使用带有 Code First 的 Entity Framework 6,并且我有一个具有以下结构的表:

public class Item
{
    [Key]
    public int ItemId { get; set; }

    [Required]
    [MaxLength(255)]
    public string Name { get; set; }}

    public Item Parent { get; set; }
    public virtual List<Item> Children { get; set; }       
}

我想知道是否有可能对数据库进行一次查询/访问,所有Items 穿过我的树直到根,提供itemId 作为参数。

例如,给我从ItemId 55 开始的所有父母,直到找不到父母。

【问题讨论】:

  • 我认为不可能。可能必须映射到带有存储过程的递归 CTE。
  • 在这里呼应@GraemeMiller:我最近不得不做类似的事情,这就是我最终这样做的方式。

标签: c# entity-framework


【解决方案1】:

使用任何理智的代码,您无法在一次旅行中获得所有父母。

但是你可以这样做:https://stackoverflow.com/a/11565855/304832

通过稍微修改您的实体,您可以添加 2 个派生集合:

public class Item
{
    [Key]
    public int ItemId { get; set; }

    [Required]
    [MaxLength(255)]
    public string Name { get; set; }}

    public virtual Item Parent { get; set; } // be sure to make this virtual
    public virtual List<Item> Children { get; set; }

    public virtual ICollection<ItemNode> Ancestors { get; set; }
    public virtual ICollection<ItemNode> Offspring { get; set; }
}

您确实需要引入一个新实体来完成这项工作,如下所示:

public class ItemNode
{
    public int AncestorId { get; set; }
    public virtual Item Ancestor { get; set; }

    public int OffspringId { get; set; }
    public virtual Item Offspring { get; set; }

    public int Separation { get; set; } // optional
}

现在,如果你愿意

从 ItemId 55 开始的所有父项,直到找不到父项

...你可以这样做:

IEnumerable<Item> allParentsFrom55 = dbContext.Set<Item>()
    .Find(55).Ancestors.Select(x => x.Ancestor);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 2016-05-09
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多