0

我正在尝试为我们的 CRM 实体之一实施批处理。

我有 2 个场景 1. 添加实体记录,然后更新相同的实体记录(因为我们不能添加非活动记录,所以需要第二次调用使其处于非活动状态)。2.获取实体记录并将其与另一个实体取消链接。

示例代码如下:

var record = client.For<entity1>().Filter(p => p.primaryKey == inputParam.entity1.primaryKey).
   Set(new { statecode = 0 }).InsertEntryAsync(false);

 client.For<entity1>().Filter(p => p.primaryKey == record.primaryKey).
   Set(new { statecode = 1 }).UpdateEntryAsync(false);

另外请让我知道是否有可能使用 Odata Batch 检索记录和更新记录。

我正在使用 simple.Odata.Client 库。

谢谢。帕里托什

4

1 回答 1

0

如果要在 UpdateEntry 中使用记录,则必须调用 InsertEntryAsync 并设置为 true 以表示您需要返回的结果,然后才能在更新请求中使用它:

var record = await client
   .For<entity1>()
   .Filter(p => p.primaryKey == inputParam.entity1.primaryKey)
   .Set(new { statecode = 0 })
   .InsertEntryAsync(true);

await client
   .For<entity1>()
   .Filter(p => p.primaryKey == record.primaryKey)
   .Set(new { statecode = 1 })
   .UpdateEntryAsync(false);

对于 OData 批处理,您必须确保服务器支持批处理。然后在您的代码中,这是使用 Simple.OData.Client 推送一批最多 100 个请求的方法:

ODataClientSettings oDataSettings = new ODataClientSettings
{  
  BaseUri = new Uri(ApiUrl)
};
var batch = new ODataBatch(oDataSettings);
var entryCount = 0;
foreach (var item in entityList)
{
  entryCount++;
  batch += async c => await client
    .For<entity1>()
    .Set(item)
    .InsertEntryAsync(false);
  if ((entryCount % 100 == 0) || entryCount == entityList.Count())
  {
    await batch.ExecuteAsync();
    batch = new ODataBatch(oDataSettings);
  }
}
于 2020-09-09T09:14:03.600 回答