/// <summary> /// Simplifies getting values from Entity.FormattedValues collection /// <param name="attributeLogicalName">Attribute name</param> /// <returns>Attribute formated value</returns> public static String GetFormatedValue(this Entity entity, String attributeLogicalName) { CheckParam.CheckForNull(attributeLogicalName, nameof(attributeLogicalName)); entity.FormattedValues.TryGetValue(attributeLogicalName, out string outValue); return(outValue); }
/// <summary> /// RetrieveMultiple method override optimized for FetchExpression. Returns all pages using callback or 'yield' iterator /// </summary> /// <param name="query">A query that determines the set of record</param> /// <param name="callback">Optional function to be called for each record page</param> /// <returns>Entity set as 'yield' iterator</returns> public static IEnumerable <Entity> RetrieveMultiple(this IOrganizationService service, FetchExpression query, Action <EntityCollection> callback = null) { CheckParam.CheckForNull(query, nameof(query)); EntityCollection collection = new EntityCollection { MoreRecords = true }; /// For performance reasons it's better to load XML once XDocument document = XDocument.Parse(query.Query); while (collection.MoreRecords) { /// Paging start working if Page > 1 query.NextPage(document, collection.PagingCookie); collection = service.RetrieveMultiple(query); callback?.Invoke(collection); foreach (Entity entity in collection.Entities) { yield return(entity); } } }
/// <summary> /// Delete method override. Deletes by Alternative key /// </summary> /// <param name="reference">Entity to delete</param> public static void Delete(this IOrganizationService service, string logicalName, KeyAttributeCollection keyAttributeCollection) { CheckParam.CheckForNull(logicalName, nameof(logicalName)); CheckParam.CheckForNull(keyAttributeCollection, nameof(keyAttributeCollection)); service.Execute(new DeleteRequest() { Target = new EntityReference(logicalName, keyAttributeCollection) }); }
/// <summary> /// Update method override. Accept ConcurrencyBehavior parameter /// </summary> /// <param name="reference">Entity to delete</param> public static void Update(this IOrganizationService service, Entity entity, ConcurrencyBehavior concurrencyBehavior) { CheckParam.CheckForNull(entity, nameof(entity)); service.Execute(new UpdateRequest() { Target = entity, ConcurrencyBehavior = concurrencyBehavior }); }
/// <summary> /// Delete method override. Deletes by Alternative key /// </summary> /// <param name="reference">Entity to delete</param> public static void Delete(this IOrganizationService service, string logicalName, string keyName, object keyValue) { CheckParam.CheckForNull(keyName, nameof(keyName)); CheckParam.CheckForNull(keyValue, nameof(keyValue)); KeyAttributeCollection keys = new KeyAttributeCollection(); keys.Add(keyName, keyValue); service.Delete(logicalName, keys); }
/// <summary> /// Retrieve method override. Retrieves by Alternative key /// </summary> /// <param name="keyName">Name of alternative key</param> /// <param name="keyValue">Key value</param> public static Entity Retrieve(this IOrganizationService service, string logicalName, string keyName, object keyValue, ColumnSet columnSet) { CheckParam.CheckForNull(keyName, nameof(keyName)); CheckParam.CheckForNull(keyValue, nameof(keyValue)); KeyAttributeCollection keys = new KeyAttributeCollection { { keyName, keyValue } }; return(service.Retrieve(logicalName, keys, columnSet)); }
/// <summary> /// Retrieve method override. Retrieves by Alternative key /// </summary> /// <param name="keyName">Name of alternative key</param> /// <param name="keyValue">Key value</param> public static Entity Retrieve(this IOrganizationService service, string logicalName, KeyAttributeCollection keyAttributeCollection, ColumnSet columnSet) { CheckParam.CheckForNull(logicalName, nameof(logicalName)); CheckParam.CheckForNull(keyAttributeCollection, nameof(keyAttributeCollection)); RetrieveResponse response = service.Execute(new RetrieveRequest() { Target = new EntityReference(logicalName, keyAttributeCollection), ColumnSet = columnSet }) as RetrieveResponse; return(response.Entity); }
/// <summary> /// Simplifies getting values from linked entities attributes wrapped in AliasedValue class /// This kind of attributes can be queried by FetchExpression or QueryExpression using Linked Entities /// </summary> /// <typeparam name="T">Attribute value type</typeparam> /// <param name="attributeLogicalName">Optional. Attribute logical name</param> /// <param name="alias">>Entity alias used in LinkedEntity definition</param> /// <returns>Attribute value</returns> public static T GetAliasedValue <T>(this Entity entity, String attributeLogicalName, String alias) { CheckParam.CheckForNull(alias, nameof(alias)); String aliasedAttributeName = attributeLogicalName != null? alias + "." + attributeLogicalName : alias; AliasedValue aliasedValue = entity.GetAttributeValue <AliasedValue>(aliasedAttributeName); if (aliasedValue != null) { return((T)aliasedValue.Value); } else { return(default);
/// <summary> /// Delete method override. Takes EntityReference as input parameter /// </summary> /// <param name="reference">Entity to delete</param> public static void Delete(this IOrganizationService service, EntityReference reference) { CheckParam.CheckForNull(reference, nameof(reference)); /// Delete by id if possible as is supposed to be faster if (reference.Id != Guid.Empty) { service.Delete(reference.LogicalName, reference.Id); } /// Use alternative key else { service.Delete(reference.LogicalName, reference.KeyAttributes); } }
/// <summary> /// Retrieve method override. Takes EntityReference as input parameter /// </summary> /// <param name="reference">Entity to retrieve</param> public static Entity Retrieve(this IOrganizationService service, EntityReference reference, ColumnSet columnSet) { CheckParam.CheckForNull(reference, nameof(reference)); /// Retrieve by id if possible as is supposed to be faster if (reference.Id != Guid.Empty) { return(service.Retrieve(reference.LogicalName, reference.Id, columnSet)); } /// Use alternative key else { return(service.Retrieve(reference.LogicalName, reference.KeyAttributes, columnSet)); } }
/// <summary> /// Disassociate method override. Takes EntityReference as primary entity input parameter /// </summary> public static void Disassociate(this IOrganizationService service, EntityReference primaryEntity, Relationship relationship, EntityReferenceCollection relatedEntities) { CheckParam.CheckForNull(primaryEntity, nameof(primaryEntity)); /// Disassociate by id if possible as is supposed to be faster if (primaryEntity.Id != Guid.Empty) { service.Disassociate(primaryEntity.LogicalName, primaryEntity.Id, relationship, relatedEntities); } /// Use alternative key else { service.Execute(new DisassociateRequest() { Target = primaryEntity, Relationship = relationship, RelatedEntities = relatedEntities }); } }
/// <summary> /// Universal RetrieveMultiple method override. Returns all pages using callback or 'yield' iterator /// </summary> /// <param name="query">A query that determines the set of record</param> /// <param name="callback">Optional function to be called for each record page</param> /// <returns>Entity set as 'yield' iterator</returns> public static IEnumerable <Entity> RetrieveMultiple(this IOrganizationService service, QueryBase query, Action <EntityCollection> callback = null) { CheckParam.CheckForNull(query, nameof(query)); EntityCollection collection = new EntityCollection { MoreRecords = true }; while (collection.MoreRecords) { /// Paging start working if Page > 1 query.NextPage(collection.PagingCookie); collection = service.RetrieveMultiple(query); callback?.Invoke(collection); foreach (Entity entity in collection.Entities) { yield return(entity); } } }
/// <summary> /// Delete method override. Takes Entity as input parameter /// </summary> /// <param name="entity">Entity to delete</param> public static void Delete(this IOrganizationService service, Entity entity) { CheckParam.CheckForNull(entity, nameof(entity)); service.Delete(entity.ToEntityReference(true)); }
/// <summary> /// Execute method override. Returns OrganizationResponse as the specified type /// </summary> public static T Execute <T>(this IOrganizationService service, OrganizationRequest request) where T : OrganizationResponse { CheckParam.CheckForNull(request, nameof(request)); return(service.Execute(request) as T); }