Linq查询自引用对象以获取无子元素

时间:2019-05-29 13:49:48

标签: c# linq recursion lambda

我有一个显示的类别类。

/// <summary>
/// A category / matrix item
/// </summary>
public class Category : BaseItem
{
    public Category()
    {

    }

    [Key]
    public int CategoryId { get; set; }

    [MaxLength(256, ErrorMessage = "Text cannot be longer than 256 characters")]
    [Required(ErrorMessage = "Item text is required")]
    public string Text { get; set; }

    public int? ParentCategoryId { get; set; }

    public virtual Category Parent { get; set; }

}

我正在尝试编写一个函数,该函数仅允许我获取没有子元素的元素。我正在竭尽全力围绕递归逻辑。我不反对使用循环,而只是建立一个列表,但是我希望能够做一些类似将数据联接回自身的操作,DefaultIfEmpty() 然后在联接记录为null的地方再次联接。

IE: 
ID| Text   | ParentId
1 | Parent | null
2 | Child  | 1
3 | asdf   | 2
4 | asdf   | 1

我只想检索记录3和4,因为它们没有孩子。

对于完整的树函数,我已经引用了this post,但是需要更多的内容才能仅获取没有子元素的元素。

答案

由于对这个问题的一些评论,我可以使用下面的方法来完成没有子项的项目。

public IEnumerable<Category> GetChildlessCategories()
{
    return WowContext.Categories
        .GroupJoin(
            WowContext.Categories.Where(category => category.ParentCategoryId.HasValue),
            (category) => category.CategoryId,
            (child) => child.ParentCategoryId.Value,
            (category, children) => new { Children = children, Category = category })
        .Where(a => !a.Children.Any())
        .Select(a => a.Category).ToList();
}

1 个答案:

答案 0 :(得分:0)

感谢对此问题的评论,我能够使用下面的查询来完成此操作。

public IEnumerable<Category> GetChildlessCategories()
{
    return WowContext.Categories
    .GroupJoin(
        WowContext.Categories.Where(category => category.ParentCategoryId.HasValue),
        (category) => category.CategoryId,
        (child) => child.ParentCategoryId.Value,
        (category, children) => new { Children = children, Category = category })
    .Where(a => !a.Children.Any())
    .Select(a => a.Category).ToList();
}