示例#1
0
 protected void SendRecordRange(RecordSet set, int start)
 {
     try
     {
         var name   = typeof(RecordModel).Name;
         var res    = set.Where(r => r.Id != 0).ToArray().Select(r => (new Record()).CopyFrom(r) as Record).ToList();
         var result = new DTResultHub <Record> {
             data = res, name = name, start = start
         };
         Clients.Caller.recordRange(result);
     }
     catch (Exception ex)
     {
         Clients.Caller.reportError("No se han podido listar registros:\n" + innerException(ex));
     }
 }
示例#2
0
        /// <summary>
        /// Devuelve los registros que se pidan.
        /// </summary>
        /// <param name="param">Parámetro de Datatables para especificar una serie de registros con filtrado incluido.</param>
        /// <returns></returns>
        public virtual DTResultHub <Record> GetRecords(DTParameters param = null)
        {
            DTResultHub <Record> ret = null;

            try
            {
                LogIdentity(System.Reflection.MethodInfo.GetCurrentMethod());

                var           sw           = Stopwatch.StartNew();
                List <string> columnSearch = new List <string>();

                if (param == null)
                {
                    param = new DTParameters();
                }

                if (param.Columns != null)
                {
                    foreach (var column in param.Columns)
                    {
                        if (column.Searchable)
                        {
                            var value = column.Search.Value;
                            columnSearch.Add(value == "" ? null : (value.StartsWith("^") && value.EndsWith("$")) ? value.Substring(1, value.Length - 2) : value); // + '%'
                        }
                    }
                }
                var orderNameDesc = new Dictionary <string, string>();
                if (param.Columns != null && param.Order != null) // && param.Order.Length > 0
                {
                    foreach (var order in param.Order)
                    {
                        var nColumn = order.Column;
                        var column  = param.Columns[nColumn];
                        if (column.Orderable)
                        {
                            var ascDesc = order.Dir.ToLower();
                            if (ascDesc != "desc")
                            {
                                ascDesc = "";
                            }
                            orderNameDesc[column.Data] = ascDesc;
                        }
                    }
                }
                if (orderNameDesc.Count == 0)
                {
                    // Si no se ha especificado correctamente al menos una columna para ordenar, buscar la primera que sea ordenable
                    foreach (var column in param.Columns)
                    {
                        if (column.Orderable)
                        {
                            orderNameDesc[column.Data] = "";
                            break;
                        }
                    }
                }

                var paramSearch   = new { search = param.Search, order = param.Order, columns = param.Columns };
                var lastFindToken = serializer.Serialize(paramSearch);
                using (var context = new Context())
                {
                    var last = lastQuerySearch.Find(x => x.lastFindToken == lastFindToken);
                    if (last == null)
                    {
                        countTotal = -1;
                    }
                    var data = GetResultObject(
                        context, //out countTotal,
                        param.Search.Value,
                        orderNameDesc,
                        param.Start,
                        param.Length,
                        columnSearch
                        );

                    var dataList = data.ToArray().Select(
                        s => (Record)(new Record()).CopyFrom(s)
                        ).ToList();
                    //var dataList = getDataList(data);
                    if (last == null && countTotal >= 0)
                    {
                        lastQuerySearch.Insert(0, new LastQuerySearch()
                        {
                            countTotal = countTotal, lastFindToken = lastFindToken
                        });
                        var idx = lastQuerySearch.Count;
                        if (idx > 5)
                        {
                            lastQuerySearch.RemoveAt(idx - 1);
                        }
                    }

                    var queryTokenType = new { recordsTotal = countTotal, recordsFiltered = countTotal, search = param.Search, order = param.Order, columns = param.Columns };
                    //var queryToken = serializer.Serialize(queryTokenType).ToLower();

                    var elapsed = sw.Elapsed;

                    //int count = RecordModel.Count(dtsource, param.Search.Value, columnSearch);
                    //var json = GetJsonResult(data);
                    var name = typeof(RecordModel).Name;
                    ret = new DTResultHub <Record>
                    {
                        name       = name,
                        queryToken = queryTokenType,
                        //queryToken = "(" + dataList.Count.ToString() + '/' + countTotal.ToString() + ") " + lastFindToken,
                        start           = param.Start,
                        draw            = param.Draw,
                        data            = dataList,
                        recordsFiltered = countTotal, // data.Count(),
                        recordsTotal    = countTotal,
                        elapsed         = elapsed.TotalMilliseconds
                    };
                    //Clients.Caller.recordRange(result);
                    //ret = true;
                }
            }
            catch (Exception ex)
            {
                Clients.Caller.reportError("No se han podido listar registros:\n" + innerException(ex));
            }
            return(ret);
        }