如何批量删除两个日期之间的记录?

时间:2018-08-02 13:54:45

标签: c# dynamics-crm microsoft-dynamics dynamics-365 dynamics-crm-365

我想删除两个日期之间的记录。我使用Fetchxml表达式获取两个日期之间每个记录的GUID,然后使用service.Delete。这是我的代码:

string fetchXml = @" <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                        <entity name='new_units'>
                            <link-entity name='new_alterunitorder' from ='new_orderlineid' to = 'new_unitsid' >
                                <attribute name='new_alterunitorderid' />
                                <filter type='and'>
                                    <condition attribute='new_orderdate' operator='on-or-after' value='" + startDate.ToShortDateString() + @"' />
                                    <condition attribute='new_orderdate' operator='on-or-before' value='" + endDate.ToShortDateString() + @"' />
                                    <condition attribute='new_orderlineid' operator='eq' uiname='" + uiName + @"' uitype='new_units' value='" + unitOrderId + @"' />
                                </filter>
                            </link-entity>
                        </entity>
                    </fetch>";

                    EntityCollection result = service.RetrieveMultiple(new FetchExpression(fetchXml));

                    //Delete the collection 
                    foreach (var id in result.Entities)
                    {
                        var entRef = id.GetAttributeValue<EntityReference>("new_alterunitorderid");
                        var guid = (Guid)entRef.Id;
                        service.Delete("new_alterunits", guid);
                    }

FetchXML的记录限制为5000条,我该如何绕过?另外,我读到,不建议使用service.Delete循环进行批量删除。请帮助我找到实现我想要做的最好的方法!

3 个答案:

答案 0 :(得分:3)

您可能还想通过BulkDeleteRequest类来研究使用本机批量删除服务。

下面是一个基本示例,this article有一个更详细的示例。如果要将FetchXML转换为QueryExpression,则可以使用FetchXmlToQueryExpressionRequest类。

// Set the request properties.
bulkDeleteRequest.JobName = "Backup Bulk Delete";

// Querying activities
bulkDeleteRequest.QuerySet = new QueryExpression[]
{
    opportunitiesQuery,
    BuildActivityQuery(Task.EntityLogicalName),
    BuildActivityQuery(Fax.EntityLogicalName),
    BuildActivityQuery(PhoneCall.EntityLogicalName),
    BuildActivityQuery(Email.EntityLogicalName),
    BuildActivityQuery(Letter.EntityLogicalName),
    BuildActivityQuery(Appointment.EntityLogicalName),
    BuildActivityQuery(ServiceAppointment.EntityLogicalName),
    BuildActivityQuery(CampaignResponse.EntityLogicalName),
    BuildActivityQuery(RecurringAppointmentMaster.EntityLogicalName)
};

// Set the start time for the bulk delete.
bulkDeleteRequest.StartDateTime = DateTime.Now;

// Set the required recurrence pattern.
bulkDeleteRequest.RecurrencePattern = String.Empty;

// Set email activity properties.
bulkDeleteRequest.SendEmailNotification = false;
bulkDeleteRequest.ToRecipients = new Guid[] { currentUserId };
bulkDeleteRequest.CCRecipients = new Guid[] { };

// Submit the bulk delete job.
// NOTE: Because this is an asynchronous operation, the response will be immediate.
_bulkDeleteResponse =
    (BulkDeleteResponse)_serviceProxy.Execute(bulkDeleteRequest);
Console.WriteLine("The bulk delete operation has been requested.");

答案 1 :(得分:2)

现在我们已经弄清了要求,这是我如何解决此问题的要点。它使用简化的FetchXML查询,但是您会明白的。

请注意,在抓取操作中添加了top='2000'

var fetchXml = @" <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' top='2000'>
                     <entity name='new_sampledata' />                                  
                   </fetch>";

var result = svc.RetrieveMultiple(new FetchExpression(fetchXml));

var entityRefs = result.Entities.Select(e=> e.ToEntityReference());

//instead of e.ToEntityReference(), you'd use e.GetAttributeValue<EntityReference>("new_alterunitorderid")
//like this:
//var entityRefs = result.Entities.Select(e=> e.GetAttributeValue<EntityReference>("new_alterunitorderid"));

var batchSize = 1000;
var batchNum = 0;
var numDeleted = 0;

while (numDeleted < entityRefs.Count())
{
    var multiReq = new ExecuteMultipleRequest()
    {
        Settings = new ExecuteMultipleSettings()
        {
            ContinueOnError = false,
            ReturnResponses = false
        },
        Requests = new OrganizationRequestCollection()
    };

    var currentList = entityRefs.Skip(batchSize * batchNum).Take(batchSize).ToList();

    currentList.ForEach(r => multiReq.Requests.Add(new DeleteRequest { Target = r }));

    svc.Execute(multiReq);

    numDeleted += currentList.Count;
    batchNum++;
}

答案 2 :(得分:1)

  

FetchXML的记录限制为5000条,我该如何绕过它?

答案是Paging cookie

可以使用ExecuteMultipleRequest进行批量删除。

public static void BulkDelete(IOrganizationService service, DataCollection<EntityReference> entityReferences)
   {
       // Create an ExecuteMultipleRequest object.
       var multipleRequest = new ExecuteMultipleRequest()
       {
           // Assign settings that define execution behavior: continue on error, return responses. 
           Settings = new ExecuteMultipleSettings()
           {
               ContinueOnError = false,
               ReturnResponses = true
           },
           // Create an empty organization request collection.
           Requests = new OrganizationRequestCollection()
       };

       // Add a DeleteRequest for each entity to the request collection.
       foreach (var entityRef in entityReferences)
       {
           DeleteRequest deleteRequest = new DeleteRequest { Target = entityRef };
           multipleRequest.Requests.Add(deleteRequest);
       }

       // Execute all the requests in the request collection using a single web method call.
       ExecuteMultipleResponse multipleResponse = (ExecuteMultipleResponse)service.Execute(multipleRequest);
   }

Reference