У меня более 1000 клиентов и счетов, и я пытаюсь выбрать всех этих клиентов и счета в раскрывающийся список.
Документация на сайте QBO предполагает, что нам нужно использовать нумерацию страниц, если я хочу загрузить всех клиентов в сетке, но я хочу загрузить всех клиентов и счета-фактуры в раскрывающемся списке.
Я получаю следующее исключение при попытке получить более 1000 клиентов и счетов-фактур:
Исключение проверки было брошено.
Подробности: QueryValidationError: значение 100000 слишком велико. Максимально допустимое значение 1000.
Я пытаюсь получить все клиенты, используя следующий код
public static List<Customer> GetAllQBOCustomers(ServiceContext context)
{
return Helper.FindAll<Customer>(context, new Customer(),1,100000);
}
3 ответа
Я написал код ниже и решил свою проблему.
1. First I get the count of all the customers
2. Then I get all the customers in chunks and the chunk size is 1000
3. Create a List for customers.
4. Define 3 integer type variables for counting.
5. After that use do-while loop
6. Add all the customers are added to the main customer list
string strQuery = "Select Count(*) From Customer";
string custCount = qboAccess.GetCutomerCount(qboInz.QboServiceContext, strQuery);
List<qboData.Customer> customers = new List<Customer>();
int maxSize = 0;
int position = 1;
int count = Convert.ToInt32(custCount);
do
{
var custList = qboAccess.GetAllQBOEntityRecords(qboInz.QboServiceContext, new Customer(), position, 1000);
customers.AddRange(custList);
maxSize += custList.Count();
position += 1000;
} while (count > maxSize);
Простой ответ - зациклить достаточно времени, чтобы получить нужные записи:
public static List<Customer> GetAllQBOCustomers(ServiceContext context)
{
var list = new List<Customer>();
for (int i=0; i<=10000; i+= 1000)
{
var results = Helper.FindAll<Customer>(context, new Customer(),i, 1000);
list.AddRange(results);
}
return list;
}
Или, если вы хотите попробовать сделать это параллельно (а API допускает параллельные соединения):
public static List<Customer> GetAllQBOCustomers(ServiceContext context)
{
var bag = new ConcurrentBag<Customer>();
Parallel.ForEach( Enumerable.Range(0, 10), i =>
{
var results = Helper.FindAll<Customer>(context, new Customer(),i * 1000, 1000);
bag.AddRange(results);
});
return bag.ToList();
}
Поскольку серия звонков, вероятно, будет дорогой, я предлагаю вам кешировать результаты.
Вы не можете скачать эти записи сразу. Это то, что говорит вам ошибка - очень ясно. Нет волшебного способа избежать правил сервера.
Тем не менее, я действительно думаю, что вы все равно не должны загружать их все сразу. Выпадающий список не является хорошим способом отображения такого количества данных для пользователей. Подумайте об опыте пользователя - хотите ли вы прокрутить список тысяч клиентов, чтобы найти нужного? Или было бы легче начать вводить часть имени, и у нее появится короткий список возможных совпадений на выбор?
Более удобный способ реализовать это - использовать поле автозаполнения вместо раскрывающегося списка, и после того, как пользователь набрал несколько символов, он может использовать AJAX для поиска в API клиентов, чьи имена или идентификаторы содержат эти персонажи. Тогда вам нужно будет только возвращать небольшое количество записей каждый раз, и пользователь не будет застревать при необходимости прокручивать в течение 10 минут, просто чтобы найти клиента внизу списка из 10000 записей.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.