我正在开发一个需要从一个系统中获取实体的应用程序(来自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的原因。有没有更好的替代方案来实现这一目标?
提前致谢。