...

Выбрать определенных пользователей (Объ)

Тема в разделе "Проблемы/ошибки", создана пользователем dimich1978, 20 фев 2020.

  1. dimich1978

    dimich1978 Member

    Создал объект
    DepartmentConspriacies
    в нем два поля Department (тип строка) и ZayavkiNaSIZ (Список Пользователей, Объект Многие ко многим)
    Мне необходимо выбрать требуемых пользователей и внести их в список.
    1. Я формирую ID этих пользователей и формирую часть запроса в переменной

    Код:
       context.Stroka1 += "and ZayavkiNaSIZ in (";
    for (var i=0; i < context.usersForSubprocess.Count; i++)
    {
    context.Stroka1 += context.usersForSubprocess.ElementAt(i).Id +",";
    }
    context.Stroka1 = context.Stroka1.Remove(context.Stroka1.Length-1);
    context.Stroka1 += ")";
    2. Ограничиваю выборку и добавляю в список
    Код:
    var Departments = EntityManager<DepartmentConspriacies>.Instance.Find ("NOT Department is null"+context.Stroka1);
                foreach (var depart in Departments) {
                    foreach (var user in depart.ZayavkiNaSIZ)
                    {
                       
                        var Request = EntityManager<P_ZayavkaKanz_Requests_temp22>.Create ();
                        Request.Department = EntityManager<DepartmentConspriacies>.Instance.Load (depart.Id);
                        Request.User = user;
                        context.Requests_temp.Add (Request);
                    }
                
    Но у меня выводятся не только пользователи , которые были мной добавлены, но и еще те, которые находятся в том же отделе, что и те, которых я добавил.
    т.е. к примеру
    Пользователь Отдел
    User1 1
    User2 2
    User3 1
    User4 1
    Если я выбрал User1, то в список добавляются User3,User4. А мне нужно чтобы добавлялся только User1
    Заранее спасибо. Я только начинаю разбираться , возникает по ходу вопросы.
     
  2. zinger

    zinger New Member

    Ну, во-первых
    var Departments = EntityManager<DepartmentConspriacies>.Instance.Find ("NOT Department is null"+context.Stroka1);
    корректно не отработает, т.к. в скобках неправильное eql условие (в строке Id-шники пользователей, а поиск департаментов, а так же в конце строки полюбому будет запятая, что точно не даст отработать eql корректно)
     
  3. dimich1978

    dimich1978 Member

    Отрезает запятую в конце
    context.Stroka1 = context.Stroka1.Remove(context.Stroka1.Length-1);
     
  4. zinger

    zinger New Member

    context.Requests_temp - какого типа свойство?
     
  5. dimich1978

    dimich1978 Member

    Это блок, и в нем два свойства
    1. Пользователь (User) - (Пользователи )Одиночная 1-1 или N-1
    2. Отдел (Department) - (Отделы)Одиночная 1-1 или N-1 , где Отделы это таблица DepartmentConspriacies
    Таблица DepartmentConspriacies состоит из двух столбцов
    Department (тип строка) и ZayavkiNaSIZ (Список Пользователей, Объект Многие ко многим), т.е. у ZayavkiNaSIZ есть таблица связи M_DC_ZayavkiNaSIZ. Ну а в ней уже Parent и child.
    И вот мне нужно чтобы в список Requests_temp добавлялись записи. К примеру я выбрал несколько пользователей одного отдела. В список должны попасть все выбранные пользователи с указанием отделов.
    Есть ограничение, выбирать можно пользователей , которые есть в Отделе
    Я пробовал вместо динамики, сделать статичный запрос:
    вместо
    "NOT Department is null"+context.Stroka1
    я писал "ZayavkiNaSIZ in (101,90)", где 90 и 101 ID пользователей, которые точно есть в этой таблице. В итоге я получал список всех пользователей принадлежащие к отделу, к которому принадлежат 90 и 101 пользователи, пользователи остальных отделов игнорировались.
     
  6. dimich1978

    dimich1978 Member

    Возможно не очень красиво, но работает, если еще цикл(for) по выбранным пользователям организовать
    Вот так работает, отбирает, тех , кого нужно.

    Код:
    var Departments = EntityManager<DepartmentConspriacies>.Instance.Find ("NOT Department is null");
    foreach (var depart in Departments) {
    foreach (var user in depart.ZayavkiNaSIZ)
    {
    for (var i=0; i < context.usersForSubprocess.Count; i++)
    {
    if (user.UserName == context.usersForSubprocess.ElementAt(i).UserName)
    {
    var Request = EntityManager<P_ZayavkaKanz_Requests_temp22>.Create ();
    Request.Department = EntityManager<DepartmentConspriacies>.Instance.Load (depart.Id);
    Request.User = user;
    context.Requests_temp.Add (Request);
    }
    }
     
  7. zinger

    zinger New Member

    действительно не очень красиво. я не до конца понял вашу цель, запутался немного, но могу дать совет по оптимизации кода

    в этом foreach
    foreach (var user in depart.ZayavkiNaSIZ)
    вы пробегаете пользователей и далее, путем цикла и if, проверяете на совпадение. Вместо этого проверку можно сделать так:
    var Departments = EntityManager<DepartmentConspriacies>.Instance.Find ("NOT Department is null");
    foreach (var depart in Departments) {
    foreach (var user in depart.ZayavkiNaSIZ)
    {
    if (context.usersForSubprocess.Contains(user))
    {
    var Request = EntityManager<P_ZayavkaKanz_Requests_temp22>.Create ();
    Request.Department = EntityManager<DepartmentConspriacies>.Instance.Load (depart.Id);
    Request.User = user;
    context.Requests_temp.Add (Request);
    }
    }
    }
    Таким образом вы уйдете от лишнего цикла
     
  8. dimich1978

    dimich1978 Member

    Спасибо
     
  9. ahkyamov

    ahkyamov Member

    Итого, я так понял, надо создать связку департамент - пользователь на основании известного списка пользователей.
    то есть надо сделать сильно проще:
    Код:
    foreach(var usr in context.usersForSubprocess)
    {
      var dep = EntityManager<DepartmentConspriacies>.Instance.Find (String.Format("NOT Department is null and ZayavkiNaSIZ in ({0})", usr.Id).FirstOrDefault();
      if (dep != null)
      {
        var Request = EntityManager<P_ZayavkaKanz_Requests_temp22>.Create ();
        Request.Department = dep;
        Request.User = usr;
        context.Requests_temp.Add (Request);
      }
    }
     
    1 это нравится

Поделиться: