Skip to main content
Community site session details

Community site session details

Session Id : 30ZJvALivPdBHj8WdFOOYB
Power Apps - Microsoft Dataverse
Answered

N:N Intersect Table

Like (0) ShareShare
ReportReport
Posted on 20 Dec 2021 10:31:38 by 559

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

  • Verified answer
    AnthonyD Profile Picture
    559 on 21 Dec 2021 at 11:00:57
    Re: N:N Intersect Table

    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

  • AnthonyD Profile Picture
    559 on 21 Dec 2021 at 10:13:07
    Re: N:N Intersect Table

    @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

  • Bipin D365 Profile Picture
    971 on 21 Dec 2021 at 10:05:11
    Re: N:N Intersect Table

    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/

  • AnthonyD Profile Picture
    559 on 21 Dec 2021 at 07:27:07
    Re: N:N Intersect Table

    @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

     

  • Ram Prakash Profile Picture
    5,318 Super User 2025 Season 2 on 20 Dec 2021 at 16:41:32
    Re: N:N Intersect Table

    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

     

  • AnthonyD Profile Picture
    559 on 20 Dec 2021 at 12:47:51
    Re: N:N Intersect Table

    @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

  • Ram Prakash Profile Picture
    5,318 Super User 2025 Season 2 on 20 Dec 2021 at 12:02:42
    Re: N:N Intersect Table

    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

  • AnthonyD Profile Picture
    559 on 20 Dec 2021 at 11:24:43
    Re: N:N Intersect Table

    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

  • Bipin D365 Profile Picture
    971 on 20 Dec 2021 at 11:19:41
    Re: N:N Intersect Table

    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/

  • Ram Prakash Profile Picture
    5,318 Super User 2025 Season 2 on 20 Dec 2021 at 10:58:24
    Re: N:N Intersect Table

    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

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Announcing our 2025 Season 2 Super Users!

A new season of Super Users has arrived, and we are so grateful for…

Paul Stork – Community Spotlight

We are honored to recognize Paul Stork as our July 2025 Community…

Congratulations to the June Top 10 Community Leaders!

These are the community rock stars!

Leaderboard > Power Apps

#1
WarrenBelz Profile Picture

WarrenBelz 637 Most Valuable Professional

#2
stampcoin Profile Picture

stampcoin 570 Super User 2025 Season 2

#3
Power Apps 1919 Profile Picture

Power Apps 1919 473

Featured topics

Loading complete