private CintDynEntityCollection GetMatchingRecords(CintDynEntity cdEntity, List <string> matchattributes, List <string> updateattributes, bool preretrieveall, ref CintDynEntityCollection cAllRecordsToMatch) { log.StartSection(MethodBase.GetCurrentMethod().Name); CintDynEntityCollection matches = null; var allattributes = new List <string>(); allattributes.Add(cdEntity.PrimaryIdAttribute); if (cdEntity.Contains("ownerid")) { allattributes.Add("ownerid"); } if (cdEntity.Contains("statecode") || cdEntity.Contains("statuscode")) { allattributes.Add("statecode"); allattributes.Add("statuscode"); } allattributes = allattributes.Union(matchattributes.Union(updateattributes)).ToList(); if (preretrieveall) { if (cAllRecordsToMatch == null) { cAllRecordsToMatch = GetAllRecordsForMatching(allattributes, cdEntity); } matches = GetMatchingRecordsFromPreRetrieved(matchattributes, cdEntity, cAllRecordsToMatch); } else { QueryExpression qMatch = new QueryExpression(cdEntity.Name); // We need to be able to see if any attributes have changed, so lets make sure matching records have all the attributes that will be updated qMatch.ColumnSet = new ColumnSet(allattributes.ToArray()); foreach (var matchattr in matchattributes) { object value = null; if (cdEntity.Entity.Contains(matchattr)) { value = CintEntity.AttributeToBaseType(cdEntity.Entity[matchattr]); } else if (matchattr == cdEntity.PrimaryIdAttribute) { value = cdEntity.Id; } if (value != null) { CintQryExp.AppendCondition(qMatch.Criteria, LogicalOperator.And, matchattr, Microsoft.Xrm.Sdk.Query.ConditionOperator.Equal, value); } else { CintQryExp.AppendCondition(qMatch.Criteria, LogicalOperator.And, matchattr, Microsoft.Xrm.Sdk.Query.ConditionOperator.Null, null); } } #if DEBUG log.Log("Finding matches for {0}:\n{1}", cdEntity, CintQryExp.ConvertToFetchXml(qMatch, crmsvc)); #endif matches = CintDynEntity.RetrieveMultiple(crmsvc, qMatch, log); } log.EndSection(); return(matches); }
private static string GetEntityDisplayString(XmlNode xMatch, CintDynEntity cdEntity) { var unique = new List <string>(); if (xMatch != null && xMatch.ChildNodes.Count > 0) { foreach (XmlNode xMatchAttr in xMatch.ChildNodes) { string matchdisplay = CintXML.GetAttribute(xMatchAttr, "Display"); if (string.IsNullOrEmpty(matchdisplay)) { matchdisplay = CintXML.GetAttribute(xMatchAttr, "Name"); } var matchvalue = "<null>"; if (cdEntity.Contains(matchdisplay, true)) { if (cdEntity.Entity[matchdisplay] is EntityReference) { // Don't use PropertyAsString, that would perform GetRelated that we don't want due to performance var entref = cdEntity.Property <EntityReference>(matchdisplay, null); if (!string.IsNullOrEmpty(entref.Name)) { matchvalue = entref.Name; } else { matchvalue = entref.LogicalName + ":" + entref.Id.ToString(); } } else { matchvalue = cdEntity.PropertyAsString(matchdisplay, "", false, false, true); } } unique.Add(matchvalue); } } if (unique.Count == 0) { unique.Add(cdEntity.Id.ToString()); } return(string.Join(", ", unique)); }
private static string GetEntityDisplayString(DataBlockImportMatch match, CintDynEntity cdEntity) { var unique = new List <string>(); if (match != null && match.Attribute.Length > 0) { foreach (var attribute in match.Attribute) { var matchdisplay = attribute.Display; if (string.IsNullOrEmpty(matchdisplay)) { matchdisplay = attribute.Name; } var matchvalue = "<null>"; if (cdEntity.Contains(matchdisplay, true)) { if (cdEntity.Entity[matchdisplay] is EntityReference) { // Don't use PropertyAsString, that would perform GetRelated that we don't want due to performance var entref = cdEntity.Property <EntityReference>(matchdisplay, null); if (!string.IsNullOrEmpty(entref.Name)) { matchvalue = entref.Name; } else { matchvalue = entref.LogicalName + ":" + entref.Id.ToString(); } } else { matchvalue = cdEntity.PropertyAsString(matchdisplay, "", false, false, true); } } unique.Add(matchvalue); } } if (unique.Count == 0) { unique.Add(cdEntity.Id.ToString()); } return(string.Join(", ", unique)); }