public List <Invoice> GetInvoices( String searchText, InvoiceStatus?status, DateTime issueDateFrom, DateTime issueDateTo, DateTime dueDateFrom, DateTime dueDateTo, EntityType entityType, int entityID, String currency, int from, int count, OrderBy orderBy) { if (_crmSecurity.IsAdmin) { return(GetCrudeInvoices( searchText, status, issueDateFrom, issueDateTo, dueDateFrom, dueDateTo, entityType, entityID, currency, from, count, orderBy)); } var crudeInvoices = GetCrudeInvoices( searchText, status, issueDateFrom, issueDateTo, dueDateFrom, dueDateTo, entityType, entityID, currency, 0, from + count, orderBy); if (crudeInvoices.Count == 0) { return(crudeInvoices); } if (crudeInvoices.Count < from + count) { return(_crmSecurity.FilterRead(crudeInvoices).Skip(from).ToList()); } var result = _crmSecurity.FilterRead(crudeInvoices).ToList(); if (result.Count == crudeInvoices.Count) { return(result.Skip(from).ToList()); } var localCount = count; var localFrom = from + count; while (true) { crudeInvoices = GetCrudeInvoices( searchText, status, issueDateFrom, issueDateTo, dueDateFrom, dueDateTo, entityType, entityID, currency, localFrom, localCount, orderBy); if (crudeInvoices.Count == 0) { break; } result.AddRange(_crmSecurity.FilterRead(crudeInvoices)); if ((result.Count >= count + from) || (crudeInvoices.Count < localCount)) { break; } localFrom += localCount; localCount = localCount * 2; } return(result.Skip(from).Take(count).ToList()); }