Как получить список родителей и детей в зависимости от стоимости их детей в Линке? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть две модели: Category и ExternalResources:

Category

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; }
}

ExternalResources

public partial class ExternalResource
{
    public string DisplayText { get; set; }
    public string URL { get; set; }
    public long CategoryID { get; set; }
    public int ExternalResourceID { get; set; }
    public bool SupportItem { get; set; }
    public bool IsInActivity { get; set; }

    public virtual Category Category { get; set; }
}

Переменная с именем IsInActivity - это та, которую я использую, чтобы узнать, показывать ли ее в списке или нет.

Я хочу показать список с родителями и только их детьми, у которых есть переменная IsInActivity установлено на true

Я создал функцию, которая возвращает родителей, в которых есть хотя бы 1 дочерний элемент, значение которого равно true, но я хочу, чтобы оно было тольковозвращает потомков с IsInActivity в true.

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

    return lstResourceIsInActivity;
}

Есть ли способ сделать это с 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;
}

Какрешить эту проблему с LinQ?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вы можете попробовать это, чтобы сбросить ваши ExternalResources коллекции только в itens, где 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;
}
0 голосов
/ 17 мая 2018

Предполагая, что вы на самом деле не хотите изменять Category объекты, вам необходимо создать новые с отфильтрованными ресурсами.

Например:

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();

Обратите внимание, что у меня нет заполненных ParentCategory или Subcategories здесь.Если вам это нужно, вам нужно будет проделать значительно большую работу, чтобы обеспечить сохранение ссылочной целостности и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...