如何使用 Factories GetByFilter 方法和 prestasharp 获取超过 5000 个实体
how to get more than 5000 entities by using Factories GetByFilter method with prestasharp
库版本:
1.2.9
NuGet 包Url:
https://www.nuget.org/packages/PrestaSharp/1.2.9
Prestashop 版本:
1.7.7.0
描述错误:
总是带有分页的 PrestaSharp GetByFilter return 相同的实体列表
由于 ProductFactory 的 GetByFilter 方法 return如果有超过 5000 个产品与过滤器匹配,则为 null。我决定像这样通过分页来获取它们
_productFactory.GetIdsByFilter(filter, null, "[" + startingIndex.ToString() + "," + count.ToString() + "]");
但即使 startingIndex(因为循环)发生变化,结果也是一样的
完整代码:
filter.Add("date_upd", "[" + dFrom + "," + dTo + "]");
int i = 0;
List<long> AllProducts = new List<long>();
List<long> products;
while (true) // this loop never breaks
{
int startingIndex = i++ * count;
products = _productFactory.GetIdsByFilter(filter, null, "[" + startingIndex.ToString() + "," + (count).ToString() + "]"); // returns same products in every iteration
if (products?.Any() == true) // to check the list is not empty
{
AllProducts.AddRange(products);
if (products.Count < count)
{
break;
}
}
else
break;
}
您只需删除 'limit' 参数中的括号即可。当 Github 文档给出带括号的示例时,这是一个错误。这是我自己的实现,我并行发送多个请求以加快处理速度,问候。
public async Task<List<PS_Entity>> GetElements(int pageSize = 100) {
try {
var numberOfElements = factory.GetIds().Count;
var numberOfParallelTasks = numberOfElements >= pageSize ? numberOfElements / pageSize : 1;
var loadElementsTasks = Enumerable.Range(0, numberOfParallelTasks).Select(taskNumber => factory.GetByFilterAsync(null, "id_ASC", $"{taskNumber * pageSize},{pageSize}")).ToList();
if (numberOfElements % pageSize != 0) {
var skiped = numberOfParallelTasks * pageSize;
loadElementsTasks.Add(factory.GetByFilterAsync(null, "id_ASC", $"{skiped},{numberOfElements - skiped}"));
}
var elements = (await Task.WhenAll(loadElementsTasks)).SelectMany(elements => elements).ToList();
return elements;
} catch (PrestaSharpException e) {
if ((int)e.ResponseHttpStatusCode == 404)
Console.WriteLine($"No existen {RemoveFactoryFromName(factory)}'s.");
return new List<PS_Entity>();
}
}
库版本:
1.2.9
NuGet 包Url:
https://www.nuget.org/packages/PrestaSharp/1.2.9
Prestashop 版本:
1.7.7.0
描述错误:
总是带有分页的 PrestaSharp GetByFilter return 相同的实体列表
由于 ProductFactory 的 GetByFilter 方法 return如果有超过 5000 个产品与过滤器匹配,则为 null。我决定像这样通过分页来获取它们
_productFactory.GetIdsByFilter(filter, null, "[" + startingIndex.ToString() + "," + count.ToString() + "]");
但即使 startingIndex(因为循环)发生变化,结果也是一样的
完整代码:
filter.Add("date_upd", "[" + dFrom + "," + dTo + "]");
int i = 0;
List<long> AllProducts = new List<long>();
List<long> products;
while (true) // this loop never breaks
{
int startingIndex = i++ * count;
products = _productFactory.GetIdsByFilter(filter, null, "[" + startingIndex.ToString() + "," + (count).ToString() + "]"); // returns same products in every iteration
if (products?.Any() == true) // to check the list is not empty
{
AllProducts.AddRange(products);
if (products.Count < count)
{
break;
}
}
else
break;
}
您只需删除 'limit' 参数中的括号即可。当 Github 文档给出带括号的示例时,这是一个错误。这是我自己的实现,我并行发送多个请求以加快处理速度,问候。
public async Task<List<PS_Entity>> GetElements(int pageSize = 100) {
try {
var numberOfElements = factory.GetIds().Count;
var numberOfParallelTasks = numberOfElements >= pageSize ? numberOfElements / pageSize : 1;
var loadElementsTasks = Enumerable.Range(0, numberOfParallelTasks).Select(taskNumber => factory.GetByFilterAsync(null, "id_ASC", $"{taskNumber * pageSize},{pageSize}")).ToList();
if (numberOfElements % pageSize != 0) {
var skiped = numberOfParallelTasks * pageSize;
loadElementsTasks.Add(factory.GetByFilterAsync(null, "id_ASC", $"{skiped},{numberOfElements - skiped}"));
}
var elements = (await Task.WhenAll(loadElementsTasks)).SelectMany(elements => elements).ToList();
return elements;
} catch (PrestaSharpException e) {
if ((int)e.ResponseHttpStatusCode == 404)
Console.WriteLine($"No existen {RemoveFactoryFromName(factory)}'s.");
return new List<PS_Entity>();
}
}