C# 如何根据孩子在Linq中的价值获取家长和孩子的列表?

C# 如何根据孩子在Linq中的价值获取家长和孩子的列表?,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有两个模型,类别和外部资源: 类别 public partial class Category { public long CategoryID { get; set; } public string Name { get; set; } public Nullable<long> ParentCategoryID { get; set; } public virtual ICollection<Category> Subcategor

我有两个模型,类别和外部资源:

类别

public partial class Category
{
    public long CategoryID { get; set; }
    public string Name { get; set; }
    public Nullable<long> ParentCategoryID { get; set; }

    public virtual ICollection<Category> Subcategories { get; set; }
    public virtual Category ParentCategory { get; set; }
    public virtual ICollection<ExternalResource> ExternalResources { get; set; }
}
名为IsInActivity的变量是我用来确定是否显示在列表中的变量

我想显示一个列表,其中包含父母和他们的孩子,变量IsInActivity设置为true

我制作了一个函数,返回至少包含一个值为true的子级的父级,但我想要的是,它只返回值为true的IsInActivity子级

public  List<Category> ContainsResources(List<Category> qry)
{
    List<Category> lstResourceIsInActivity =  qry.Where(p => p.ExternalResources.Any(c => c.IsInActivity = true)).ToList();

    return lstResourceIsInActivity;
}
公共列表包含资源(列表qry)
{
List lstResourceIsInActivity=qry.Where(p=>p.ExternalResources.Any(c=>c.IsInActivity=true)).ToList();
资源敏感性;
}
有没有办法让Linq做到这一点

[更新]

已经解决了我以前的疑问,另一个疑问出现了,在本例中,如果有子类别(父类别)和选定的子类别,则返回子类别,但不返回父类别

我创建了这个函数,但它返回了我上面提到的内容:

public List<Category> ContainsResources(List<Category> qry)
{
            List<Category> lstResourceIsInActivity = qry.Where(c => c.ExternalResources.Any(r => r.IsInActivity)).Select(c => new Category
            {
                CategoryID = c.CategoryID,
                Name = c.Name,
                ParentCategoryID = c.ParentCategoryID,
                Subcategories = c.Subcategories.Where(b => b.ExternalResources.Any(r => r.IsInActivity) && b.ParentCategoryID != null).Select(b => new Category
                {
                    CategoryID = b.CategoryID,
                    Name = b.Name,
                    ParentCategoryID = b.ParentCategoryID,
                    ExternalResources = b.ExternalResources.Where(r => r.IsInActivity).ToList()
                }).ToList(),
                ParentCategory = c.ParentCategory,
                ExternalResources = c.ExternalResources.Where(r => r.IsInActivity).ToList()
            })
         .ToList();

            return lstResourceIsInActivity;
}
公共列表包含资源(列表qry)
{
列出lstResourceIsInActivity=qry.Where(c=>c.ExternalResources.Any(r=>r.IsInActivity))。选择(c=>newcategory
{
CategoryID=c.CategoryID,
Name=c.Name,
ParentCategoryID=c.ParentCategoryID,
Subcategories=c.Subcategories.Where(b=>b.ExternalResources.Any(r=>r.isinacitivity)和&b.ParentCategoryID!=null)。选择(b=>newcategory
{
CategoryID=b.CategoryID,
Name=b.Name,
ParentCategoryID=b.ParentCategoryID,
ExternalResources=b.ExternalResources.Where(r=>r.IsInActivity).ToList()
}).ToList(),
ParentCategory=c.ParentCategory,
ExternalResources=c.ExternalResources.Where(r=>r.IsInActivity).ToList()
})
.ToList();
资源敏感性;
}

如何使用LinQ解决此问题?

假设您不想实际修改
类别
对象,则需要使用中过滤的资源创建新对象

例如:

public List<Category> ContainsResources(List<Category> query) =>
    query.Where(c => c.ExternalResources.Any(r => r.IsInActivity))
         .Select(c => new Category
                 {
                     CategoryID = c.CategoryID,
                     Name = c.Name,
                     ParentCategoryID = c.ParentCategoryID,
                     ExternalResources = c.ExternalResources.Where(r => r.IsInActivity).ToList()
                 })
         .ToList();
公共列表包含资源(列表查询)=>
query.Where(c=>c.ExternalResources.Any(r=>r.IsInActivity))
.选择(c=>新类别
{
CategoryID=c.CategoryID,
Name=c.Name,
ParentCategoryID=c.ParentCategoryID,
ExternalResources=c.ExternalResources.Where(r=>r.IsInActivity).ToList()
})
.ToList();

请注意,我没有在这里填充
ParentCategory
Subcategories
。如果您需要这些,您将需要做更多的工作来确保引用完整性等。

您可以尝试将
外部资源
集合仅重置为
IsInActivity==true

public List<Category> ContainsResources(List<Category> qry)
{
    List<Category> lstResourceIsInActivity =  qry.Where(p => p.ExternalResources.Any(c => c.IsInActivity)).ToList();

    lstResourceIsInActivity.ForEach(c => c.ExternalResources = c.ExternalResources.Where(e => e.IsInActivity).ToList());

    return lstResourceIsInActivity;
}
公共列表包含资源(列表qry)
{
List lstResourceIsInActivity=qry.Where(p=>p.ExternalResources.Any(c=>c.IsInActivity)).ToList();
ForEach(c=>c.ExternalResources=c.ExternalResources.Where(e=>e.IsInActivity.ToList());
资源敏感性;
}

请注意,当前您正在将
IsInActivity
设置为true,而不是测试它是否为true。
c.IsInActivity=true
应该是
c.IsInActivity==true
,工作得很好,目前只显示主要链接很好,但我将使用子类别,非常感谢!虽然这会起作用,但对于一个主要用于查询数据以实际修改数据的方法来说,这几乎总是一个坏主意。你是对的。虽然第一行末尾的
.ToList()
正在将所需项目复制到新列表中,但原始项目正在使用
ForEach
方法进行修改。
public List<Category> ContainsResources(List<Category> qry)
{
    List<Category> lstResourceIsInActivity =  qry.Where(p => p.ExternalResources.Any(c => c.IsInActivity)).ToList();

    lstResourceIsInActivity.ForEach(c => c.ExternalResources = c.ExternalResources.Where(e => e.IsInActivity).ToList());

    return lstResourceIsInActivity;
}