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)); } }
/// <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); }