[CSHARP-4589] Left Joins With Three or More Collection Not Working Created: 30/Mar/23  Updated: 28/Oct/23  Resolved: 05/Apr/23

Status: Closed
Project: C# Driver
Component/s: None
Affects Version/s: None
Fix Version/s: 2.19.2

Type: Bug Priority: Unknown
Reporter: Uday Dangrecha Assignee: Robert Stam
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Documentation Changes: Not Needed
Documentation Changes Summary:

1. What would you like to communicate to the user about this feature?
2. Would you like the user to see examples of the syntax and/or executable code and its output?
3. Which versions of the driver/connector does this apply to?


 Description   

Summary

When trying to join 3 or more collection with left join in single query the driver gives "Operation is not valid due to the current state of the object" error.

MongoDB Version: 5.0.3

.NET Driver Version: 2.18.0
Linq Provider: V3

How to Reproduce

1) Create a linq left join query having 3 or more collections

2) Try to execute it.

            • Linq Query -----*

 

var teamDetailsQuery = (from team in _DBContext.Teams.AsQueryable()
                        join teamAllianceMappingsList in DBContext.TeamAllianceMappings.AsQueryable() on team.TeamId equals teamAllianceMappingsList.TeamId into teamAllianceMappingsListTemp
                        from allinceMapping in teamAllianceMappingsListTemp.DefaultIfEmpty()
 
                        join organizationAdminsList in _DBContext.OrganizationAdmins.AsQueryable() on team.OrganizationId equals organizationAdminsList.OrganizationId into organizationAdminsListTemp
                        from organizationAdmin in organizationAdminsListTemp.DefaultIfEmpty()
 
                        join usersList in _AGLMongoDBContext.Users.AsQueryable() on organizationAdmin.UserId equals usersList.UserId into usersListTemp
                        from organizationUser in usersListTemp.DefaultIfEmpty()
 
                        select new
                        {
                            TeamId = team.TeamId,
                            TeamName = team.TeamName,
                            OrganizationLogo = (organizationUser != null ? organizationUser.ProfileImage : team.OrganizationLogo),
                            OrganizationName = team.OrganizationName,
                            AllianceTeamId = allinceMapping.AllianceTeamId
                        }).AsQueryable();
 
var teamDetails = teamDetailsQuery.FirstOrDefault(); 

 

 

            • Error -----*

 

System.InvalidOperationException: Operation is not valid due to the current state of the object.
at MongoDB.Driver.Linq.Linq3Implementation.Serializers.WrappedValueSerializer`1.TryGetMemberSerializationInfo(String memberName, BsonSerializationInfo& serializationInfo)
at MongoDB.Driver.Linq.Linq3Implementation.Misc.DocumentSerializerHelper.HasFieldInfo(IBsonSerializer serializer, String memberName)
at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MemberExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, MemberExpression expression)
at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MemberExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, MemberExpression expression)
at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MemberExpressionToAggregationExpressionTranslator.Translate(TranslationContext context, MemberExpression expression)
at MongoDB.Driver.Linq.Linq3Implementation.Misc.LambdaExpressionExtensions.GetFieldPath(LambdaExpression fieldSelectorLambda, TranslationContext context, IBsonSerializer parameterSerializer)
at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToPipelineTranslators.GroupJoinMethodToPipelineTranslator.Translate(TranslationContext context, MethodCallExpression expression)
at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToPipelineTranslators.SelectManyMethodToPipelineTranslator.Translate(TranslationContext context, MethodCallExpression expression)
at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToPipelineTranslators.GroupJoinMethodToPipelineTranslator.Translate(TranslationContext context, MethodCallExpression expression)
at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToPipelineTranslators.SelectManyMethodToPipelineTranslator.Translate(TranslationContext context, MethodCallExpression expression)
at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToExecutableQueryTranslators.ExpressionToExecutableQueryTranslator.Translate[TDocument,TOutput](MongoQueryProvider`1 provider, Expression expression)
at MongoDB.Driver.Linq.Linq3Implementation.MongoQuery`2.ToString() 

 

 

            • Expression -----*

              {agl.Teams.Aggregate([]).GroupJoin(agl.TeamAllianceMappings.Aggregate([]), team => team.TeamId, teamAllianceMappingsList => teamAllianceMappingsList.TeamId, (team, teamAllianceMappingsListTemp) => new <>f__AnonymousType307`2(team = team, teamAllianceMappingsListTemp = teamAllianceMappingsListTemp)).SelectMany(<>h__TransparentIdentifier0 => <>h__TransparentIdentifier0.teamAllianceMappingsListTemp.DefaultIfEmpty(), (<>h__TransparentIdentifier0, allinceMapping) => new <>f__AnonymousType308`2(<>h__TransparentIdentifier0 = <>h__TransparentIdentifier0, allinceMapping = allinceMapping)).GroupJoin(agl.OrganizationAdmins.Aggregate([]), <>h__TransparentIdentifier1 => <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.team.OrganizationId, organizationAdminsList => Convert(organizationAdminsList.OrganizationId, Nullable`1), (<>h__TransparentIdentifier1, organizationAdminsListTemp) => new <>f__AnonymousType309`2(<>h__TransparentIdentifier1 = <>h__TransparentIdentifier1, organizationAdminsListTemp = organizationAdminsListTemp)).SelectMany(<>h__TransparentIdentifier2 => <>h__TransparentIdentifier2.organizationAdminsListTemp.DefaultIfEmpty(), (<>h__TransparentIdentifier2, organizationAdmin) => new <>f__AnonymousType310`2(<>h__TransparentIdentifier2 = <>h__TransparentIdentifier2, organizationAdmin = organizationAdmin)).GroupJoin(agl.Users.Aggregate([]), <>h__TransparentIdentifier3 => <>h__TransparentIdentifier3.organizationAdmin.UserId, usersList => usersList.UserId, (<>h__TransparentIdentifier3, usersListTemp) => new <>f__AnonymousType311`2(<>h__TransparentIdentifier3 = <>h__TransparentIdentifier3, usersListTemp = usersListTemp)).SelectMany(<>h__TransparentIdentifier4 => <>h__TransparentIdentifier4.usersListTemp.DefaultIfEmpty(), (<>h__TransparentIdentifier4, organizationUser) => new <>f__AnonymousType312`5(TeamId = <>h__TransparentIdentifier4.<>h__TransparentIdentifier3.<>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.team.TeamId, TeamName = <>h__TransparentIdentifier4.<>h__TransparentIdentifier3.<>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.team.TeamName, OrganizationLogo = IIF((organizationUser != null), organizationUser.ProfileImage, <>h__TransparentIdentifier4.<>h__TransparentIdentifier3.<>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.team.OrganizationLogo), OrganizationName = <>h__TransparentIdentifier4.<>h__TransparentIdentifier3.<>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.team.OrganizationName, AllianceTeamId = <>h__TransparentIdentifier4.<>h__TransparentIdentifier3.<>h__TransparentIdentifier2.<>h__TransparentIdentifier1.allinceMapping.AllianceTeamId))} 

              Additional Background

 



 Comments   
Comment by Githook User [ 18/May/23 ]

Author:

{'name': 'rstam', 'email': 'robert@robertstam.org', 'username': 'rstam'}

Message: CSHARP-4589: Fix issue with multiple GroupJoins.
Branch: v2.19.x
https://github.com/mongodb/mongo-csharp-driver/commit/bb93334cbf6838182e9b82d4ead937b941dfc8ea

Comment by Githook User [ 05/Apr/23 ]

Author:

{'name': 'rstam', 'email': 'robert@robertstam.org', 'username': 'rstam'}

Message: CSHARP-4589: Fix issue with multiple GroupJoins.
Branch: master
https://github.com/mongodb/mongo-csharp-driver/commit/ed0502a6895f4dae876c4efe4d0522ab3a96f1fe

Comment by Robert Stam [ 04/Apr/23 ]

Thank you for reporting this issue.

I have a fix in code review.

Generated at Wed Feb 07 21:48:41 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.