Is there any way to find the hidden N:N intersect table name? I would need this for a custom plugin i am writing.
Best Regards,
Anthony
Solved! Go to Solution.
I found my solution,
To retrieve the intersect entity table name:
Then i changed my code to:
if (context.MessageName == "Update" && context.Stage == 20)
{
targetEntity = context.InputParameters["Target"] as Entity;
var courseID = targetEntity.Id;
var query = new QueryExpression()
{
//Set this to the entity you wish to retrieve data from
EntityName = "cref8_cursist",
//This will return us all columns for each record returned
ColumnSet = new ColumnSet(true),
};
//AddLink(RELATIONSHIP ENTITY NAME, ENTITY UNIQUE ID FROM THE ENTITIE YOU WISH TO RETRIEVE DATA FROM, ENTITY UNIQUE ID FROM THE ENTITIE YOU WISH TO RETRIEVE DATA FROM
var link = query.AddLink("cref8_opleiding_cref8_cursist", "cref8_cursistid", "cref8_cursistid");
link.LinkCriteria = new FilterExpression()
{
//Add this to filter the Trainee records for a specified Course
Conditions =
{
new ConditionExpression("cref8_opleidingid", ConditionOperator.Equal, courseID)
}
};
//Invoke the service with our query
var subjectEntities = service.RetrieveMultiple(query);
//Loop through the result
for (var i = 0; i < subjectEntities.Entities.Count; i++)
{
//Do some logic
}
}
This now returns me all Trainees of the Training i did the Disassociate on. Thank you for the help @bipinshan and @rampprakash .
Best Regards,
Anthony
Hello @Anthony_Dob,
Hope you are doing good.
As per OOB there will be No Table available for N:N Relationship. You need to find the Relationship name.
For Example if you are creating N:N relationship between Account and User you need to go to Account table
2. Click Dataverse --> Click Tables --> Click Account
3. Click Relationship
4. In the Relationship type look for MANY-MANY relationship
string entity1 = Account.EntityLogicalName;
string entity2 = User.EntityLogicalName;
string relationshipName = "cr28c_account_systemuser_systemuser";
QueryExpression query = new QueryExpression(entity1);
LinkEntity linkEntity1 = new LinkEntity(entity1, relationshipName , "accountid", "accountid", JoinOperator.Inner);
LinkEntity linkEntity2 = new LinkEntity(relationshipName , entity2, "systemuserid", "systemuserid", JoinOperator.Inner);
linkEntity1.LinkEntities.Add(linkEntity2);
query.LinkEntities.Add(linkEntity1);
return this.organizationservice.RetrieveMultiple(query);
Change your Entity name/Relatioship name and EntityID based on your needs
Please mark as Answer if it is helpful and provide Kudos
Subscribe : https://www.youtube.com/channel/UCnGNN3hdlKBOr6PXotskNLA
Blog : https://microsoftcrmtechie.blogspot.com
Hi @Anthony_Dob ,
If you are looking for a c# code to create record in N:N relationship intersect table then you can use below code -
// Create new Associate Request object for creating a N:N relationsip between User and Security
AssociateRequest objAssociateRequest = new AssociateRequest();
// Create related entity reference object for associating relationship
// In this case we SystemUser entity reference
objAssociateRequest.RelatedEntities = new EntityReferenceCollection();
objAssociateRequest.RelatedEntities.Add(new EntityReference("systemuser", guidSystemUserId));
// Create new Relationship object for System User & Security Role entity schema and assigning it
// to request relationship property
objAssociateRequest.Relationship = new Relationship("systemuserroles_association");
// Create target entity reference object for associating relationship
objAssociateRequest.Target = new EntityReference("role", guidSecurityRoleId);
// Passing AssosiateRequest object to Crm Service Execute method for assigning Security Role to User
crmService.Execute(objAssociateRequest);
You will need to update Relationship name, Target entity & Related entity in above code snippet.
If you would like to retrieve the N:N records then use the code provided by Ram.
Please mark my answer verified if this is helpful!
Regards,
Bipin Kumar
Follow my Blog: https://xrmdynamicscrm.wordpress.com/
I think @rampprakash code will do the job. I would like to debug it though to see if it works. However if i check the Profile tab where all my triggers are found. I see only the "Associate" triggers are found and no "Disassociate". The code for "Disassociate" works because i see my fields updated. Any reason why Disassociates would not be recognized by the profiler?
Best Regards,
Anthony
Hello @Anthony_Dob,
I can see the plugin profile is triggering
Can you please make sure you provided NONE for PRIMARY and SECONDARY Entity
Can you please UnInstall and Install Profiler again.
Please mark as Answer if it is helpful and provide Kudos
Subscribe : https://www.youtube.com/channel/UCnGNN3hdlKBOr6PXotskNLA
Blog : https://microsoftcrmtechie.blogspot.com
@rampprakash apparently my profiler was bugged or something.. Reinstalling it did the job. Thank you. However i am still running in some issues. I think you are receiving both sides of the N:N as a JSON, right? I only receive TrainingID (target) and CuristID(s) (relatedEntities) in my JSON because that's where the Disassociate happens.
The scenario is the following: Cursist get's deleted from a Training ->All Extra Costs from that training and which are related to the Cursist getting deleted should be retrieved for calculations. So I would need a query that retrieves me the Extra Costs from that training and which were related to the removed Cursist with only the CursistID and TrainingID.
Best Regards,
Anthony
Hello @Anthony_Dob,
Yes, in Disassociate operation we will get only ID of Both related Entities.
Suggestion:
1. You will have one Parent Record where we are holding ALL Extra Costs for Cursist.
2. While Association Keep on Updating the Respective Extra Costs by Retrieving all the Association Records.
3. Create another Field Name it as Disassociate All Extra Costs. While Disassociation, use retrive code and Update the Created Field
4. Now you got both ALL EXTRA COSTS (ORGINAL) and AFTER DISSASSOCIATION Cost so you can use that two field to get the exact hours which got disassociated.
Let me know if you need more clarity
Please mark as Answer if it is helpful and provide Kudos
Subscribe : https://www.youtube.com/channel/UCnGNN3hdlKBOr6PXotskNLA
Blog : https://microsoftcrmtechie.blogspot.com
@rampprakash I am not entirely following you there.
This is what i currently have:
Is there a easy way to filter the extra costs in the EntityCollection that match the costs related to the cursist (N:N)?
//TRAINING DATA var opleiding = service.Retrieve(targetEntity.LogicalName, targetEntity.Id, new ColumnSet(true)); //YEARLY BUDGET CURSIST DATA ConditionExpression ceYearlyBudgetFromTrainee = new ConditionExpression("cref8_cursist", ConditionOperator.Equal, relatedEntity.Id); ConditionExpression ceYearlyBudgetYear = new ConditionExpression("cref8_jaar", ConditionOperator.Equal, opleiding.Attributes.FirstOrDefault(q => q.Key == "cref8_jaarstartopleiding").Value); FilterExpression filter = new FilterExpression(); filter.Conditions.Add(ceYearlyBudgetFromTrainee); filter.Conditions.Add(ceYearlyBudgetYear); QueryExpression qeYearlyBudget = new QueryExpression("cref8_jaarlijkbudget"); qeYearlyBudget.ColumnSet = new ColumnSet(true); qeYearlyBudget.Criteria.AddFilter(filter); EntityCollection yearlyBudgetResult = service.RetrieveMultiple(qeYearlyBudget); //TRAINING DURATION DATA ConditionExpression ceOpleidingDuratie = new ConditionExpression("cref8_opleidingduratie", ConditionOperator.Equal, targetEntity.Id); QueryExpression qeOpleidingDuratie = new QueryExpression("cref8_duratie"); qeOpleidingDuratie.ColumnSet = new ColumnSet(true); qeOpleidingDuratie.Criteria.AddCondition(ceOpleidingDuratie); EntityCollection opleidingDuratieResult = service.RetrieveMultiple(qeOpleidingDuratie); //TRAINING EXTRA COSTS DATA ConditionExpression ceOpleidingExtraKost = new ConditionExpression("cref8_extrakosttraining", ConditionOperator.Equal, targetEntity.Id); QueryExpression qeOpleidingExtraKost = new QueryExpression("cref8_extrakost"); qeOpleidingExtraKost.ColumnSet = new ColumnSet(true); qeOpleidingExtraKost.Criteria.AddCondition(ceOpleidingExtraKost); EntityCollection opleidingExtraKostResult = service.RetrieveMultiple(qeOpleidingExtraKost); // LOGIC TO FILTER OPLEIDINGEXTRAKOSTRESULT SO IT MATCHES THE EXTRA COSTS RELATED TO THE CURSIST // //cref8_extrakost TABLE //cref8_cursist TABLE //cref8_ExtraKost_cref8_Cursist_cref8_Cursi N:N RELATION // // SOME STUFF I TRIED ALREADY //string entity1 = relatedEntity.LogicalName; //string entity2 = "cref8_extrakost"; //string relationshipNamee = "cref8_ExtraKost_cref8_Cursist_cref8_Cursi"; //QueryExpression query = new QueryExpression(entity1); //LinkEntity linkEntity1 = new LinkEntity(entity1, relationshipNamee, "cref8_cursistid", "cref8_cursistid", JoinOperator.Inner); //LinkEntity linkEntity2 = new LinkEntity(relationshipNamee, entity2, "cref8_extrakostid", "cref8_extrakostid", JoinOperator.Inner); //linkEntity1.LinkEntities.Add(linkEntity2); //query.LinkEntities.Add(linkEntity1); //var data = service.RetrieveMultiple(query); //QueryExpression x = new QueryExpression(); //x.EntityName = "cref8_extrakost"; //x.ColumnSet = new ColumnSet(true); //x.LinkEntities.Add(new LinkEntity("cref8_cursist", "cref8_ExtraKost_cref8_Cursist_cref8_Cursi", "cref8_cursistid", "cref8_cursistid", JoinOperator.Inner)); //x.LinkEntities[0].Columns.AddColumns("cref8_prijs", "cref8_name"); //x.Criteria = new FilterExpression(); //x.Criteria.AddCondition("cref8_cursistid", ConditionOperator.Equal, relatedEntity.Id); //x.Orders.Add(new OrderExpression("cref8_fullname", OrderType.Descending)); //x.Distinct = true; //EntityCollection ec = service.RetrieveMultiple(x); //
Best Regards,
Anthony
Hi @Anthony_Dob ,
Why write complex code when you construct your query using Advanced find and download the fetchxml which you execute in your plugin code -
https://docs.microsoft.com/en-us/powerapps/developer/data-platform/use-fetchxml-construct-query
Please mark my answer verified if this is helpful!
Regards,
Bipin Kumar
Follow my Blog: https://xrmdynamicscrm.wordpress.com/
I just started working with plugins, doing custom actions on Dataverse triggers so I don't have many experience on this matter. I will have to look in fetchxml to see how it works and what it does as.
Thanx for pointing this out,
Best Regards,
Anthony
This training provides practical hands-on experience in creating Power Apps solutions in a full-day of instructor-led App creation workshop.
Come together to explore latest innovations in code and application development—and gain insights from experts from around the world.
User | Count |
---|---|
11 | |
7 | |
7 | |
6 | |
4 |
User | Count |
---|---|
38 | |
23 | |
14 | |
8 | |
8 |