Entity Framework сложное множественное условие - PullRequest
0 голосов
/ 26 марта 2020

У меня есть база данных, в которой я пытаюсь отслеживать утверждения документов. Каждый документ имеет 1 или более задач. Каждое задание имеет 1 или более утверждений. Каждое утверждение имеет идентификатор назначенного пользователя, а также назначенной группы. Каждый пользователь может принадлежать к одной или нескольким группам и может иметь различные разрешения в каждой группе. Эта информация хранится в таблице отношений «многие ко многим» с дополнительным полем для уровня разрешений. (user_id, group_id, license_id)

Например, утверждение задачи может быть назначено пользователю с ID = 5 и группе с ID = 7. Чтобы пользователь мог утвердить это утверждение, он должен иметь идентификатор пользователя 5 или принадлежать к группе 7 с разрешением на утверждение.

Я хотел бы создать запрос, который выбирает все утверждения, назначенные конкретному пользователю или принадлежащие к группе, к которой у конкретного пользователя есть права «осведомленности».

Я легко возможность запросить только идентификатор пользователя с помощью:

var approvals = context.APPROVALS
                       .Where(a => a.APPROVER_ID == CurrentUserID)
                       .ToList();

Моя проблема также проверяет группы, на которые у текущего пользователя есть права «осведомленности». Лучшее, что я смог придумать, - это сохранить список групп осведомленности пользователей (сохраненных как CurrentUserAwarnessGroups в приведенном ниже примере) и выполнить что-то вроде следующего:

var approvals = context.APPROVALS
                       .Where(a => a.APPROVER_ID == CurrentUserID || CurrentUserAwarnessGroups.Contains(a.GROUP_ID))

Этот метод запроса не удался для меня, чтобы не упомянуть, я предполагаю, что это должно выполнить по крайней мере часть этого запроса на стороне клиента, что означает, что возвращен намного больший (и более длинный) запрос.

Может кто-нибудь предложить лучший способ выполнить эту функцию? Я могу изменить свою базу данных, если это необходимо.

1 Ответ

0 голосов
/ 26 марта 2020

Итак, я смог найти лучший метод. Мой подход был неверным. Вместо того чтобы пытаться запрашивать утверждения и включать связанного пользователя, я запросил пользователя и включил связанные утверждения исключительно на основе их группы. Я определил, что группа утверждений всегда будет содержать идентификатор утверждающего, поэтому я могу запрашивать базу данных по одной группе и затем фильтровать по утверждающему на клиентском компьютере. Кроме того, используя побитовые сравнения для управления «членством» в соответствии с рекомендациями mxmissile, я могу упростить свою таблицу групп пользователей.

Мое решение выглядит так:

var user = context.USERs
                  .Where(u => u.USER_ID == CurrentUserID)
                  .FirstOrDefault();

var tempUserApprovals = user.GROUPTOUSER.SelectMany("GROUP.APPROVALS");
var userApprovals = new ObservableCollection<APPROVAL>();

foreach(var approval in tempUserApprovals)
{
    foreach(var group in CurrentUsersGroups)
    {
        if(approval.GROUP.GROUP_ID == group.GROUP_ID && ((int)group.MEMBERSHIP & Membership.is_aware == Membership.is_aware || approval.APPROVER_ID == CurrentUserID))
        {
            userApprovals.Add(approval);
        }
    }
}

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