示例#1
0
        public void RefreshTable(ChancelerryDBDataContext dataContext, object userID, Registers register, object regId, Table dataTable, Dictionary <int, string> searchList)
        {
            dataTable.Rows.Clear();
            // Достаем поля для данного реестра и пользователя на основе RegisterView и прав пользователя RegistersUsersMap c сортировкой по весу
            var fieldsAll = (from regUsrMap in dataContext.RegistersUsersMap
                             join regView in dataContext.RegistersView on regUsrMap.registersUsersMapID equals regView.fk_registersUsersMap
                             join _fields in dataContext.Fields.OrderByDescending(n => n.fieldID == 1) on regView.fk_field equals _fields.fieldID
                             where regUsrMap.fk_user == Convert.ToInt32(userID) && regUsrMap.fk_register == register.registerID && regView.active
                             select new { _fields.name, _fields.fieldID, regView.weight }).OrderBy(w => w.weight).ToList();
            var fieldsName = (from f in fieldsAll select f.name).ToList();
            var fieldsId   = (from f in fieldsAll select f.fieldID).ToList();


            // Поиск
            dataTable.Rows.Add(AddSearchHeaderRoFromList(fieldsId));

            // Заголовки
            dataTable.Rows.Add(AddHeaderRoFromList(fieldsName));

            // Карточки этого реестра + номера документов по которым фильтровать
            var cardsAllFull = (from card in dataContext.CollectedCards
                                join collected in dataContext.CollectedFieldsValues on card.collectedCardID equals collected.fk_collectedCard
                                join field in dataContext.Fields on collected.fk_field equals field.fieldID
                                where card.fk_register == (int)HttpContext.Current.Session["registerID"] &&
                                card.active &&
                                field.type == "autoIncrement"
                                select new DataOne()
            {
                id = card.collectedCardID, textValue = collected.valueText
            }).ToList();                                                                                                // LOG !!! {try catch в каком поле ошибка}

            // добавляем в version конвертированное значение номера документа из string в int для дальнейшего фильтра
            foreach (var itm in cardsAllFull)
            {
                int tmp = 0;                            // V
                Int32.TryParse(itm.textValue, out tmp); //V
                itm.version = tmp;
            }

            List <int> cardsToShow = new List <int>(); // сюда будем складывать карточки которые нужно показать

            /*
             * if (searchList != null) //если фильтры есть
             * {
             *  bool isFirst = true;
             *  foreach (int currentKey in searchList.Keys) // проходимся по каждому фильтру
             *  {
             *      int fieldId = currentKey;
             *      string fieldValue = "";
             *      searchList.TryGetValue(fieldId, out fieldValue);  //достаем айдишник нашего филда
             *
             *      List<int> cardsWithValue = (from a in dataContext.CollectedFieldsValues
             *                                  where a.active == true && a.fk_field == fieldId && a.valueText.Contains(fieldValue)
             *                                  join b in dataContext.CollectedCards on a.fk_collectedCard equals b.collectedCardID
             *                                  where b.active == true
             *                                  select a.fk_collectedCard).Distinct().ToList(); // находим все карточки которые соответсвтуют
             *      List<int> tmpList;
             *      if (isFirst)
             *      {
             *          tmpList = cardsWithValue;
             *      }
             *      else
             *      {
             *          tmpList = (from a in cardsWithValue join b in cardsToShow on a equals b select a).Distinct().ToList();
             *      }
             *      isFirst = false;
             *      cardsToShow = tmpList;
             *  }
             * }
             * else // если фильтров нет, показываем все карточки
             * {
             *  // фильтруем по номерам документов и достаем только ID'шники карточек
             *  cardsToShow = (from a in cardsAllFull select a).OrderByDescending(n => n.version).ToList().Select(card => card.id).Distinct().ToList();
             * }
             */


            //ВАГЕКОД НАЧАЛО
            CardCommonFunctions ccf = new CardCommonFunctions();

            cardsToShow = ccf.GetCardsToShow(searchList, (int)HttpContext.Current.Session["registerID"]);
            //ВАГЕКОД КОНЕЦ

            // SIVAS OPTIMIZATION START
            List <CollectedFieldsValues> collectedFiltered = new List <CollectedFieldsValues>();

            foreach (var c in cardsToShow.Skip((int)HttpContext.Current.Session["pageCntrl"] * 10).Take(10))
            {
                collectedFiltered.AddRange(((from a in dataContext.CollectedFieldsValues where a.fk_collectedCard == c select a).ToList()));
            }
            // SIVAS OPTIMIZATION END

            HttpContext.Current.Session["pageCount"]  = (int)Math.Floor((double)cardsToShow.Count / 10) + 1; // количество страниц таблицы
            HttpContext.Current.Session["cardsCount"] = cardsToShow.Count;


            // Отрисовка //

            // по всем карточкам
            foreach (var card in cardsToShow.Skip((int)HttpContext.Current.Session["pageCntrl"] * 10).Take(10).ToList())
            {
                List <string> cardRow = new List <string>();

                foreach (var field in fieldsId)                              // проходим по каждому полю в карточке card
                {
                    StringBuilder fieldInstancesValue = new StringBuilder(); // сюда записываем все инстансы

                    // сотношение поля и  карточки в collected (получаем поле с его инстансами и версией)
                    var query = (from a in collectedFiltered
                                 where a.fk_field == field && a.fk_collectedCard == card
                                 select new DataOne()
                    {
                        textValue = a.valueText,
                        instance = a.instance,
                        version = a.version,
                        deleted = a.isDeleted
                    }).ToList();

                    // Список всех удаленных инстансов
                    var delInst = (from ins in query where ins.deleted select ins.instance).ToList();

                    // Получаем список всех инстансов для данного поля исключая удаленные
                    var instances = (from f in query
                                     where !f.deleted
                                     select f.instance).Distinct().ToList().Except(delInst.Distinct()).ToList();

                    var k = 1; // переменная для отображения порядкового номера инстанса

                    // Если инстанс 1 то отображаем без 1) и br
                    if (instances.Count <= 1)
                    {
                        fieldInstancesValue.Append(
                            (from vv in query
                             where vv.instance == instances[0] && !vv.deleted
                             select vv).OrderByDescending(v => v.version)
                            .FirstOrDefault()?.textValue);
                    }
                    else
                    {
                        foreach (var instance in instances)
                        {
                            // Забираем максимальное значение(версия) textValue каждого инстанса
                            fieldInstancesValue.Append(
                                k.ToString() + ") " +
                                (from vv in query
                                 where vv.instance == instance && !vv.deleted
                                 select vv).OrderByDescending(v => v.version)
                                .FirstOrDefault()?.textValue + "<br>");           //если не null за писываем в поле
                            k++;
                        }
                    }


                    // Добавляем значения в Row каждого поля
                    cardRow.Add(fieldInstancesValue.ToString());
                }

                dataTable.Rows.Add(AddRowFromList(cardRow, card));     // Добавляем в таблицу Row
            }
        }