Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/XrmMockupShared/Core.cs
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,10 @@ internal OrganizationResponse Execute(OrganizationRequest request, EntityReferen
pluginContext.OutputParameters["BusinessEntityCollection"] =
(response as RetrieveMultipleResponse)?.EntityCollection;
}
else if (request is RetrieveRequest)
{
pluginContext.OutputParameters["BusinessEntity"] = TryRetrieve((request as RetrieveRequest).Target);
}

if (!string.IsNullOrEmpty(eventOp))
{
Expand Down
1 change: 1 addition & 0 deletions src/XrmMockupShared/Mappings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ internal static partial class Mappings {
{ typeof(UpdateRequest), "Target" },
{ typeof(AssociateRequest), "Target" },
{ typeof(DisassociateRequest), "Target" },
{ typeof(RetrieveRequest), "Target" },
};

public static Dictionary<Type, string> RequestToEventOperation = new Dictionary<Type, string>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,12 @@ internal override OrganizationResponse Execute(OrganizationRequest orgRequest, E
colToReturn = new EntityCollection(collection.Select(x=>x.Value).ToList());
}

if (queryExpr.Distinct)
{
var uniqueIds = new HashSet<Guid>();
colToReturn = new EntityCollection(colToReturn.Entities.Where(entity => uniqueIds.Add(entity.Id)).ToList());
}

// According to docs, should return -1 if ReturnTotalRecordCount set to false
colToReturn.TotalRecordCount = queryExpr.PageInfo.ReturnTotalRecordCount ? colToReturn.Entities.Count : -1;

Expand Down
27 changes: 27 additions & 0 deletions tests/SharedPluginsAndCodeactivites/RetrievePlugin.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using DG.XrmFramework.BusinessDomain.ServiceContext;
using Microsoft.Xrm.Sdk;


namespace DG.Some.Namespace
{
public class RetrievePlugin : Plugin
{
public RetrievePlugin() : base(typeof(RetrievePlugin))
{
RegisterPluginStep<Contact>(
EventOperation.Retrieve,
ExecutionStage.PostOperation,
ExecutePostRetrieve);
}

protected void ExecutePostRetrieve(LocalPluginContext localContext)
{
var entity = localContext.PluginExecutionContext.OutputParameters["BusinessEntity"] as Entity;

if (entity.ToEntity<Contact>().StateCode == ContactState.Inactive)
{
throw new InvalidPluginExecutionException("Inactive contacts cannot be retrieved.");
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<Compile Include="$(MSBuildThisFileDirectory)AccountCustomActivity.cs" />
<Compile Include="$(MSBuildThisFileDirectory)AccountBothImagePlugin.cs" />
<Compile Include="$(MSBuildThisFileDirectory)FaxPreOperationPlugin.cs" />
<Compile Include="$(MSBuildThisFileDirectory)RetrievePlugin.cs" />
<Compile Include="$(MSBuildThisFileDirectory)UpdateIdInCreatePlugin.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ContactPostPlugin.cs" />
<Compile Include="$(MSBuildThisFileDirectory)DirectPlugins\ContactIPluginDirectPostOp.cs" />
Expand Down
14 changes: 14 additions & 0 deletions tests/SharedTests/TestRetrieve.cs
Original file line number Diff line number Diff line change
Expand Up @@ -301,5 +301,19 @@ public void TestRetrieveUserByFullName()
var users = orgAdminService.RetrieveMultiple(q);
Assert.Single(users.Entities);
}

[Fact]
public void TestRetrievePlugin()
{
var accountId = orgAdminService.Create(new Contact { LastName = "Test" });

orgAdminUIService.Update(new Contact(accountId)
{
StateCode = ContactState.Inactive,
StatusCode = Contact_StatusCode.Inactive
});

Assert.Throws<InvalidPluginExecutionException>(() => Contact.Retrieve(orgAdminService, accountId, x => x.LastName));
}
}
}
49 changes: 49 additions & 0 deletions tests/SharedTests/TestRetrieveMultiple.cs
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,44 @@ public void TestQueryExpressionLinkEntityNoSetEntityName()
Assert.Equal(2, res.Count());
}

[Fact]
public void RetrieveMultipleWithLinkEntitiesReturnDistinctResults()
{
var lead = new Lead()
{
Subject = "Lead",
ParentContactId = contact1.ToEntityReference()
};
orgAdminService.Create(lead);

var linkEntity = new LinkEntity
{
LinkToEntityName = "lead",
LinkToAttributeName = "parentcontactid",
LinkFromEntityName = "contact",
LinkFromAttributeName = "contactid",
Columns = new ColumnSet(false),
EntityAlias = "contact",
JoinOperator = JoinOperator.LeftOuter,
};

var filter = new FilterExpression(LogicalOperator.And);
filter.AddCondition(new ConditionExpression("lastname", ConditionOperator.Equal, contact1.LastName));

var query = new QueryExpression("contact")
{
Distinct = true,
ColumnSet = new ColumnSet(),
LinkEntities = { linkEntity }
};

var res = orgAdminService.RetrieveMultiple(query).Entities;

var distinctIdCount = res.Select(x => x.Id).Distinct().Count();

Assert.Equal(distinctIdCount, res.Count);
}

#endif

[Fact]
Expand Down Expand Up @@ -921,5 +959,16 @@ public void TestCaseSensitivity()

Assert.Equal("MATT", res.Entities.Single().GetAttributeValue<string>("firstname"));
}

[Fact]
public void TestRetrieveMultipleFailWithNonExistentAttribute()
{
var query = new QueryExpression("contact")
{
ColumnSet = new ColumnSet("x")
};

Assert.Throws<AggregateException>(() => orgAdminService.RetrieveMultiple(query));
}
}
}