public IEnumerable <DataModel.AuditLogModel> ToDwItems(IOrganizationService service, AuditDetail source, int langCode, IJobTime job)
        {
            List <DataModel.AuditLogModel> items = new List <DataModel.AuditLogModel>();
            var audtLog = source;

            if (source.GetType() != typeof(AttributeAuditDetail))
            {
                return(items);
            }

            var               attr       = (AttributeAuditDetail)source;
            Entity            record     = (Entity)source.AuditRecord;
            AuditLogModelBase baseEntity = new AuditLogModelBase();
            var               modified   = attr.AuditRecord.GetAttributeValue <EntityReference>("userid");

            baseEntity.EntityType     = record.GetAttributeValue <EntityReference>("objectid").LogicalName;
            baseEntity.EntityTypeDesc = record.FormattedValues["objecttypecode"];
            baseEntity.ChangeDateTime = attr.AuditRecord.GetAttributeValue <DateTime>("createdon");
            baseEntity.ChangeType     = record.FormattedValues["operation"];
            baseEntity.CrmAuditId     = audtLog.AuditRecord.Id;
            baseEntity.ModifiedByName = modified.Name;
            baseEntity.ModifiedByID   = modified.Id;
            baseEntity.JobId          = job.JobId;
            baseEntity.ModifiedOn     = DateTime.UtcNow;
            AddToListItems(service, baseEntity.EntityType, langCode, source, items, baseEntity);
            return(items);
        }
        public void RetreiveAndSet(IConfiguration config, IJobTime job, Imapping mapping, IDwService dw)
        {
            int?duplicates            = null;
            var maxRecordsPerExcution = int.Parse(config.Get("MaxRecordsPerExcution").ToString());
            var languageCode          = int.Parse(config.Get("LanguageCode").ToString());
            var untilDate             = config.Get("UntilDate").ToString();
            var isRemoveDuplicate     = config.Get("IsRemoveDuplicate").ToString();

            var last  = DateTime.UtcNow;
            var first = job.RetrieveLastDateJob(config);

            if (!String.IsNullOrWhiteSpace(untilDate))
            {
                last = DateTime.ParseExact(untilDate, "yyyy-MM-dd", null);
            }

            int pageNumber = 1; int crmLogsItemsCount = 0; int fieldsChangeCount = 0;

            List <AuditLogModel> audtLogs;
            bool moreRecords = true;

            do
            {
                audtLogs = new List <AuditLogModel>();
                audtLogs.Clear();
                var rmr  = new RetrieveMultipleRequest();
                var resp = new RetrieveMultipleResponse();

                QueryExpression query = new QueryExpression()
                {
                    EntityName = "audit",
                    ColumnSet  = new ColumnSet(true),
                    Criteria   = new FilterExpression
                    {
                        FilterOperator = LogicalOperator.And,
                        Conditions     = { new ConditionExpression
                                           {
                                               AttributeName = "createdon",
                                               Operator      = ConditionOperator.Between,
                                               Values        = { first, last } //access
                                           } },
                    },
                    Orders = { new OrderExpression
                               {
                                   AttributeName = "createdon",
                                   OrderType     = OrderType.Ascending
                               } }
                };

                query.PageInfo = new PagingInfo
                {
                    PageNumber = pageNumber,
                    Count      = maxRecordsPerExcution
                };
                rmr.Query = query;
                resp      = (RetrieveMultipleResponse)_service.Execute(rmr);
                foreach (Entity entiyAuditLog in resp.EntityCollection.Entities)
                {
                    crmLogsItemsCount++;
                    Console.WriteLine(entiyAuditLog.Id);
                    // Retrieve the audit details and display them.
                    var auditDetailsRequest = new RetrieveAuditDetailsRequest {
                        AuditId = entiyAuditLog.Id
                    };

                    var auditDetailsResponse = (RetrieveAuditDetailsResponse)_service.Execute(auditDetailsRequest);

                    var changes = mapping.ToDwItems(_service, auditDetailsResponse.AuditDetail, languageCode, job);
                    if (changes.Any())
                    {
                        audtLogs.AddRange(changes);
                        fieldsChangeCount += changes.Count();
                    }
                }
                moreRecords = resp.EntityCollection.MoreRecords;
                if (moreRecords)
                {
                    pageNumber++;
                }
                dw.BulkAdd(audtLogs);
            }while (moreRecords);
            if (isRemoveDuplicate == "1")
            {
                try
                {
                    duplicates = dw.RemoveDuplicate();
                }
                catch (Exception e)
                {
                    _log("WARNING:can not remove duplicate see log");
                    _log(e.ToString());
                }
            }
            job.UpdateEndDateOnComplete(fieldsChangeCount, crmLogsItemsCount, duplicates, last);
        }