cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Anthony_Dob
Responsive Resident
Responsive Resident

N:N Intersect Table

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

1 ACCEPTED SOLUTION

Accepted Solutions
Anthony_Dob
Responsive Resident
Responsive Resident

I found my solution,

 

To retrieve the intersect entity table name:

  1. Select your solution
  2. Switch to classic 
  3. Navigate to Entities 
  4. Navigate to the table that has the N:N
  5. Select N:N Relationship 
  6. Navigate  to the  N:N you need
  7. At the bottom -> Relationship Entity Name 

2021-12-21 11_58_42-Solution_ TBA Model Driven - Microsoft Dynamics 365.png

 

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

View solution in original post

10 REPLIES 10
rampprakash
Super User
Super User

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

 

1. https://make.powerapps.com

2. Click Dataverse --> Click Tables --> Click Account

3. Click Relationship

4. In the Relationship type look for MANY-MANY relationship

 

rampprakash_0-1639997669150.png

 

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

bipinshan
Super User
Super User

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/

Anthony_Dob
Responsive Resident
Responsive Resident

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

rampprakash
Super User
Super User

Hello @Anthony_Dob,

 

I can see the plugin profile is triggering

 

rampprakash_0-1640001731955.png

 

 

Can you please make sure you provided NONE for PRIMARY and SECONDARY Entity

 

rampprakash_1-1640001769079.png

 

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

Anthony_Dob
Responsive Resident
Responsive Resident

@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: 

  • I have a EntityReferenceCollection with  Cursists ID's (in this case its 1)
  • I have a Entity with Training
  • I have a EntityCollection with  extra costs from that particular training 

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 -

bipinshan_3-1640081298706.png

 

 

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/

@bipinshan,

 

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

Helpful resources

Announcements
PA Virtual Workshop Carousel 768x460.png

Register for a Free Workshop

This training provides practical hands-on experience in creating Power Apps solutions in a full-day of instructor-led App creation workshop.

Microsoft Build 768x460.png

Microsoft Build is May 24-26. Have you registered yet?

Come together to explore latest innovations in code and application development—and gain insights from experts from around the world.

May UG Leader Call Carousel 768x460.png

What difference can a User Group make for you?

At the monthly call, connect with other leaders and find out how community makes your experience even better.

Users online (1,432)