API调用分页并在单个JArray中存储JObject

时间:2017-02-17 07:30:07

标签: c# optimization json.net

我正在开发一个需要从一个系统中获取实体的应用程序(来自Dynamics CRM的联系人)。该应用程序对这些联系人进行了一些处理,基本上转换为其他系统的兼容有效负载,然后将其同步回来。

Dynamics CRM有超过8000个联系人,所以没有脑筋,我继续采用分页方法..代码看起来像这样 -

string nextPageUrl = string.Empty;
bool nextPageAvailable = true;
int totalContactsCount = 0;
bool firstCall = true;
JArray totalContacts = new JArray();
while (nextPageAvailable)
{
    string contacts = string.Empty;
    if (string.IsNullOrEmpty(nextPageUrl) && firstCall)
    {
        contacts = await _genericService.GetEntity("contacts", pageSize: 100);
        firstCall = false;
    }
    else
    {
       contacts = await _genericService.GetEntityFromPaginationUrl(nextPageUrl, pageSize: 100);
    }
    var contactsObj = JObject.Parse(contacts);
    var contactArr = (JArray)contactsObj["value"];
    var contactsLength = contactArr.Count;

    foreach(var contactObject in contactArr)
    {
       totalContacts.Add(contactObject);
    }
    var contactsCt = totalContacts.Count;

    nextPageUrl = contactsObj["@odata.nextLink"].IsNullOrEmpty() ? string.Empty : contactsObj["@odata.nextLink"].ToString();

    if(string.IsNullOrEmpty(nextPageUrl) && !firstCall)
    {
       nextPageAvailable = false;
    }

    Console.WriteLine(nextPageUrl);
 }

这完美无缺,但直到我获得8000个联系人(每次100个),内存利用率几乎超过 370mb 。我确信有更好的方法可以实现这一目标但却无法想到。

当我通过totalContacts重申将拥有超过8000个联系人并处理它们时,内存问题将变得更加严重。

由于来自Dynamics CRM的联系人可能具有新添加的属性,因此我无法使用模型强烈键入对象。这就是我决定选择JArray的原因。有没有更好的替代方案来实现这一目标?

提前致谢。

0 个答案:

没有答案