C#. NET Core 3.1 Entity Framework: включить использование условия where дает неправильный вывод - PullRequest
0 голосов
/ 04 августа 2020

У меня есть 2 объекта, родительский / дочерний, которые хотят выбрать их все с помощью include.

При добавлении условия для дочернего элемента он возвращает родителей, которые имеют это условие, только не все родители

Мой код:

Родительский объект:

public class SecRole
{
    public string Name { get; set; }
    public virtual ICollection<SecRolePageAction> SecRole_SecRolePageAction { get; set; }
}

Дочерний объект:

public class SecRolePageAction
{
    public virtual SecRole SecRole { get; set; }
    public long SecRoleID { get; set; }
    public bool IsDeleted { get; set; } = false;
}

Код:

var Q = Context.Set<SecRole>().AsNoTracking().AsQueryable();
Q = Q.Include(O => O.SecRole_SecRolePageAction)
      // Child condition below
     .Where(O => O.SecRole_SecRolePageAction.Any(P => P.IsDeleted == false)
     .ToList();

Результат: он возвращает только родительский объект, содержащий дочерний элемент, имеет IsDeleted = false но у любого родителя нет ребенка, он не возвращает

Мне нужно вернуть всем родителям любую помощь

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

@Keith.Abramo уже дал правильный ответ на этот вопрос.

Вот результат теста с этим решением.

        public List<SecRole> getSecRole()
        {
            var SecRoles = _context.SecRoles.Include(h => h.SecRole_SecRolePageAction)
                .Where(O => O.SecRole_SecRolePageAction.Count() == 0 || O.SecRole_SecRolePageAction.Any(P => P.IsDeleted == false)).ToList(); // include address table

            return SecRoles;
        }

Дата Источник SecRoles:

[
  {
    "Name": "1",
    "SecRole_SecRolePageAction": [
      {
        "SecRoleID": "101",
        "IsDeleted": "true"
      }
    ]
  },
  {
    "Name": "2",
    "SecRole_SecRolePageAction": [

    ]
  },
  {
    "Name": "3",
    "SecRole_SecRolePageAction": [
      {
        "SecRoleID": "301",
        "IsDeleted": "false"
      },
      {
        "SecRoleID": "302",
        "IsDeleted": "true"
      }
    ]
  }
]

Скриншот результата теста с Where

введите описание изображения здесь

2 голосов
/ 04 августа 2020

Похоже, вы правильно выбираете и включаете. Возможно, вам просто потребуется изменить предложение Where, чтобы проверить, является ли ваша дочерняя коллекция пустой / пустой ИЛИ в ней есть дочерние элементы, которые не были удалены.

Что-то вроде:

.Where(O => O.SecRole_SecRolePageAction.Count() == 0 || O.SecRole_SecRolePageAction.Any(P => P.IsDeleted == false))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...