From 935c26d03e5061a13ca223cd70ff9da6a7c9cc71 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Sun, 9 Feb 2014 20:02:49 +0100 Subject: [PATCH] Support for loading of LazyLoaded properties via explicit join. --HG-- extra : source : 1b7c96cb2a644ae17603c9d72ec09d94bc877bf1 --- src/Marr.Data/EntityGraph.cs | 13 ++++++++++++- src/Marr.Data/QGen/QueryBuilder.cs | 11 +++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Marr.Data/EntityGraph.cs b/src/Marr.Data/EntityGraph.cs index aee376b61..72d28dcdf 100644 --- a/src/Marr.Data/EntityGraph.cs +++ b/src/Marr.Data/EntityGraph.cs @@ -160,6 +160,14 @@ namespace Marr.Data get { return _children; } } + /// + /// Adds an Child in the graph for LazyLoaded property. + /// + public void AddLazyRelationship(Relationship childRelationship) + { + _children.Add(new EntityGraph(childRelationship.RelationshipInfo.EntityType.GetGenericArguments()[0], this, childRelationship)); + } + /// /// Adds an entity to the appropriate place in the object graph. /// @@ -182,7 +190,10 @@ namespace Marr.Data } else // RelationTypes.One { - _relationship.Setter(_parent._entity, entityInstance); + if (_relationship.IsLazyLoaded) + _relationship.Setter(_parent._entity, Activator.CreateInstance(_relationship.MemberType, entityInstance)); + else + _relationship.Setter(_parent._entity, entityInstance); } EntityReference entityRef = new EntityReference(entityInstance); diff --git a/src/Marr.Data/QGen/QueryBuilder.cs b/src/Marr.Data/QGen/QueryBuilder.cs index cd71c17bd..d4cddf45f 100644 --- a/src/Marr.Data/QGen/QueryBuilder.cs +++ b/src/Marr.Data/QGen/QueryBuilder.cs @@ -551,6 +551,17 @@ namespace Marr.Data.QGen return Join(joinType, rightMember, filterExpression); } + public virtual QueryBuilder Join(JoinType joinType, Expression>> rightEntity, Expression> filterExpression) + { + _isJoin = true; + MemberInfo rightMember = (rightEntity.Body as MemberExpression).Member; + + var relationship = EntGraph.Relationships.Single(v => v.Member == rightMember); + EntGraph.AddLazyRelationship(relationship); + + return Join(joinType, rightMember, filterExpression); + } + public virtual QueryBuilder Join(JoinType joinType, MemberInfo rightMember, Expression> filterExpression) { _isJoin = true;