cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Anthony_Dob
Continued Contributor
Continued Contributor

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
Continued Contributor
Continued Contributor

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

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
Solution Sage
Solution Sage

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
Continued Contributor
Continued Contributor

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

 

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
Continued Contributor
Continued Contributor

@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

Community will be READ ONLY July 16th, 5p PDT -July 22nd

Dear Community Members,   We'd like to let you know of an upcoming change to the community platform: starting July 16th, the platform will transition to a READ ONLY mode until July 22nd.   During this period, members will not be able to Kudo, Comment, or Reply to any posts.   On July 22nd, please be on the lookout for a message sent to the email address registered on your community profile. This email is crucial as it will contain your unique code and link to register for the new platform encompassing all of the communities.   What to Expect in the New Community: A more unified experience where all products, including Power Apps, Power Automate, Copilot Studio, and Power Pages, will be accessible from one community.Community Blogs that you can syndicate and link to for automatic updates. We appreciate your understanding and cooperation during this transition. Stay tuned for the exciting new features and a seamless community experience ahead!

Summer of Solutions | Week 4 Results | Winners will be posted on July 24th

We are excited to announce the Summer of Solutions Challenge!   This challenge is kicking off on Monday, June 17th and will run for (4) weeks.  The challenge is open to all Power Platform (Power Apps, Power Automate, Copilot Studio & Power Pages) community members. We invite you to participate in a quest to provide solutions in the Forums to as many questions as you can. Answers can be provided in all the communities.    Entry Period: This Challenge will consist of four weekly Entry Periods as follows (each an “Entry Period”)   - 12:00 a.m. PT on June 17, 2024 – 11:59 p.m. PT on June 23, 2024 - 12:00 a.m. PT on June 24, 2024 – 11:59 p.m. PT on June 30, 2024 - 12:00 a.m. PT on July 1, 2024 – 11:59 p.m. PT on July 7, 2024 - 12:00 a.m. PT on July 8, 2024 – 11:59 p.m. PT on July 14, 2024   Entries will be eligible for the Entry Period in which they are received and will not carryover to subsequent weekly entry periods.  You must enter into each weekly Entry Period separately.   How to Enter: We invite you to participate in a quest to provide "Accepted Solutions" to as many questions as you can. Answers can be provided in all the communities. Users must provide a solution which can be an “Accepted Solution” in the Forums in all of the communities and there are no limits to the number of “Accepted Solutions” that a member can provide for entries in this challenge, but each entry must be substantially unique and different.    Winner Selection and Prizes: At the end of each week, we will list the top ten (10) Community users which will consist of: 5 Community Members & 5 Super Users and they will advance to the final drawing. We will post each week in the News & Announcements the top 10 Solution providers.  At the end of the challenge, we will add all of the top 10 weekly names and enter them into a random drawing.  Then we will randomly select ten (10) winners (5 Community Members & 5 Super Users) from among all eligible entrants received across all weekly Entry Periods to receive the prize listed below. If a winner declines, we will draw again at random for the next winner.  A user will only be able to win once overall. If they are drawn multiple times, another user will be drawn at random.  Individuals will be contacted before the announcement with the opportunity to claim or deny the prize.  Once all of the winners have been notified, we will post in the News & Announcements of each community with the list of winners.   Each winner will receive one (1) Pass to the Power Platform Conference in Las Vegas, Sep. 18-20, 2024 ($1800 value). NOTE: Prize is for conference attendance only and any other costs such as airfare, lodging, transportation, and food are the sole responsibility of the winner. Tickets are not transferable to any other party or to next year’s event.   ** PLEASE SEE THE ATTACHED RULES for this CHALLENGE**   Week 1 Results: Congratulations to the Week 1 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersNumber of SolutionsSuper UsersNumber of Solutions @anandm08  23 @WarrenBelz  31 @DBO_DV  10 @Amik  19 AmínAA 6 @mmbr1606  12 @rzuber  4 @happyume  7 @Giraldoj  3@ANB 6 (tie)   @SpongYe  6 (tie)     Week 2 Results: Congratulations to the Week 2 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersSolutionsSuper UsersSolutions @anandm08  10@WarrenBelz 25 @DBO_DV  6@mmbr1606 14 @AmínAA 4 @Amik  12 @royg  3 @ANB  10 @AllanDeCastro  2 @SunilPashikanti  5 @Michaelfp  2 @FLMike  5 @eduardo_izzo  2   Meekou 2   @rzuber  2   @Velegandla  2     @PowerPlatform-P  2   @Micaiah  2     Week 3 Results: Congratulations to the Week 3 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 3:Community MembersSolutionsSuper UsersSolutionsPower Apps anandm0861WarrenBelz86DBO_DV25Amik66Michaelfp13mmbr160647Giraldoj13FLMike31AmínAA13SpongYe27     Week 4 Results: Congratulations to the Week 4 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 4:Community MembersSolutionsSuper UsersSolutionsPower Apps DBO-DV21WarranBelz26Giraldoj7mmbr160618Muzammmil_0695067Amik14samfawzi_acml6FLMike12tzuber6ANB8   SunilPashikanti8

Check Out | 2024 Release Wave 2 Plans for Microsoft Dynamics 365 and Microsoft Power Platform

On July 16, 2024, we published the 2024 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform. These plans are a compilation of the new capabilities planned to be released between October 2024 to March 2025. This release introduces a wealth of new features designed to enhance customer understanding and improve overall user experience, showcasing our dedication to driving digital transformation for our customers and partners.    The upcoming wave is centered around utilizing advanced AI and Microsoft Copilot technologies to enhance user productivity and streamline operations across diverse business applications. These enhancements include intelligent automation, AI-powered insights, and immersive user experiences that are designed to break down barriers between data, insights, and individuals. Watch a summary of the release highlights.    Discover the latest features that empower organizations to operate more efficiently and adaptively. From AI-driven sales insights and customer service enhancements to predictive analytics in supply chain management and autonomous financial processes, the new capabilities enable businesses to proactively address challenges and capitalize on opportunities.    

Updates to Transitions in the Power Platform Communities

We're embarking on a journey to enhance your experience by transitioning to a new community platform. Our team has been diligently working to create a fresh community site, leveraging the very Dynamics 365 and Power Platform tools our community advocates for.  We started this journey with transitioning Copilot Studio forums and blogs in June. The move marks the beginning of a new chapter, and we're eager for you to be a part of it. The rest of the Power Platform product sites will be moving over this summer.   Stay tuned for more updates as we get closer to the launch. We can't wait to welcome you to our new community space, designed with you in mind. Let's connect, learn, and grow together.   Here's to new beginnings and endless possibilities!   If you have any questions, observations or concerns throughout this process please go to https://aka.ms/PPCommSupport.   To stay up to date on the latest details of this migration and other important Community updates subscribe to our News and Announcements forums: Copilot Studio, Power Apps, Power Automate, Power Pages