Podczas korzystania z CRM możecie natrafić naprawdę na kilka miejsc gdzie aż prosi się o rozszrzenia – konwersja OptionSetValue, EntityReference czy innych tego typu rzeczy. Po prostu aż szkoda tych zbędnych znaków w edytorze :)
W tym odcinku jedna z metod, którą zacząłem ostatnio używać notorycznie. Umożliwia ona konwersje EntityReference do Guid? i na odwrót.
Kod rozszerzeń:
using System; using Microsoft.Xrm.Sdk; namespace Gutek.Utils.Crm { public static class EntityReferenceExtensions { public static Guid? ToId(this EntityReference @this) { if(@this == null) { return null; } return @this.Id; } public static EntityReference ToEntityReference<TEntity>(this Guid? @this) where TEntity : Entity, new() { if(@this == null) { return null; } var name = new TEntity().LogicalName; return new EntityReference(name, @this.Value); } public static EntityReference ToEntityReference<TEntity>(this Guid @this) where TEntity : Entity, new() { // IsEmpty -> Guid extension @this == Guid.Empty if(@this.IsEmpty()) { return null; } var name = new TEntity().LogicalName; return new EntityReference(name, @this); } } }
Kod testów:
using System; using Some.TypedEntities; using Gutek.Utils.Crm using Microsoft.Xrm.Sdk; using Xunit; namespace Gutek.Utils.Tests.Crm { public class entity_reference_extensions_tests { protected Guid? _nullGuid = null; protected Guid? _valueGuid = Guid.Parse("E47A16D8-B4C2-44BB-896D-4A6702B3198F"); protected Guid _emptyGuid = Guid.Empty; protected Guid _notEmptyGuid = Guid.Parse("E47A16D8-B4C2-44BB-896D-4A6702B3198F"); protected EntityReference _nullReference = null; protected EntityReference _valueReference = new EntityReference(Guid.New().ToStrong(), Guid.New()); } public class to_id_tests : entity_reference_extensions_tests { [Fact] public void should_return_null_guid_if_entity_is_null() { var result = _nullReference.ToId(); Assert.Null(result); } [Fact] public void should_return_guid_if_entity_is_not_null() { var result = _valueReference.ToId(); Assert.NotNull(result); Assert.Equal(_valueReference.Id, result.Value); } } public class to_entity_reference_tests : entity_reference_extensions_tests { [Fact] public void should_return_null_ref_if_guid_is_null() { var result = _nullGuid.ToEntityReference<Account>(); Assert.Null(result); } [Fact] public void should_return_null_ref_if_guid_is_empty() { var result = _emptyGuid.ToEntityReference<Account>(); Assert.Null(result); } [Fact] public void should_return_ref_with_id_and_proper_logical_name_from_not_null_guid() { var result = _valueGuid.ToEntityReference<Account>(); Assert.NotNull(result); Assert.Equal(_valueGuid.Value, result.Id); Assert.Equal(Account.EntityLogicalName, result.LogicalName); } [Fact] public void should_return_ref_with_id_and_proper_logical_name_from_not_empty_guid() { var result = _notEmptyGuid.ToEntityReference<Account>(); Assert.NotNull(result); Assert.Equal(_valueGuid.Value, result.Id); Assert.Equal(Account.EntityLogicalName, result.LogicalName); } } }