Example #1
0
            private void AddInclude(SimpleType source, MemberExpression memberSelector, LambdaExpression collectionInclude)
            {
                var members = source.GetAllMembers();

                if (members.Count > 0 && memberSelector.GetDepth() > 1)
                {
                    var innermostMember = ExpressionUtil.GetInnermostMemberExpression(memberSelector);
                    foreach (var kvp in members)
                    {
                        if (kvp.Key == innermostMember.Member)
                        {
                            AddInclude(kvp.Value, ExpressionUtil.ReplaceInnermostMemberExpressionWithParameter(memberSelector) as MemberExpression, collectionInclude);
                            return;
                        }
                    }
                }
                else
                {
                    var parameter = ExpressionUtil.GetParameterExpression(memberSelector);
                    if (collectionInclude != null)
                    {
                        source.Includes.Add(IncludeDirectiveUtil.GetIncludeInCollectionDirective(memberSelector, collectionInclude));
                    }
                    else
                    {
                        source.Includes.Add(IncludeDirectiveUtil.GetIncludeDirective(memberSelector));
                    }
                }
            }
Example #2
0
        protected virtual List <IncludeDirective> GetMemberIncludes(MemberExpression memberExp)
        {
            var newIncludes           = new List <IncludeDirective>();
            var memberIsNotCollection = !TypesUtil.IsNonPrimitiveCollection(memberExp.Type);

            Includes.ForEach(inc =>
            {
                var includeExpression = inc.GetSelector().Body as MemberExpression;
                if (memberIsNotCollection)
                {
                    var innermostMember = ExpressionUtil.GetInnermostMemberExpression(includeExpression);
                    if (innermostMember.Member == memberExp.Member && includeExpression.Expression is MemberExpression)
                    {
                        var slicedExpression = ExpressionUtil.ReplaceInnermostMemberExpressionWithParameter(includeExpression) as MemberExpression;

                        if (inc is IIncludeInCollectionDirective)
                        {
                            newIncludes.Add(IncludeDirectiveUtil.GetIncludeInCollectionDirective(slicedExpression,
                                                                                                 (inc as IIncludeInCollectionDirective).GetFieldSelector()));
                        }
                        else
                        {
                            newIncludes.Add(IncludeDirectiveUtil.GetIncludeDirective(slicedExpression));
                        }
                    }
                }
                else
                {
                    if (inc is IIncludeInCollectionDirective && ExpressionUtil.IsEquivalent(inc.GetSelector().Body, memberExp))
                    {
                        newIncludes.Add(IncludeDirectiveUtil.GetIncludeDirective
                                            ((inc as IIncludeInCollectionDirective).GetFieldSelector()));
                    }
                }
            });
            return(newIncludes);
        }
Example #3
0
        private List <IncludeBinding> GetIncludeBindings(IEnumerable <QueryBinding> queryBindings)
        {
            var bindings = new List <IncludeBinding>();

            Func <MemberExpression, IncludeBinding> getExistingBinding =
                m => bindings.Find(id => ExpressionUtil.IsEquivalent(id.IncludeDirective.GetSelector().Body, m));

            Func <MemberExpression, IncludeDirective> getIncludeDirective = m =>
            {
                var member = m.GetDepth() == 1 ? m :
                             Expression.MakeMemberAccess(Expression.Parameter(m.Expression.Type, m.Expression.Type.Name.Substring(0, 1).ToLower()), m.Member);
                return(IncludeDirectiveUtil.GetIncludeDirective(member));
            };

            foreach (var qb in queryBindings)
            {
                //Allowing not included collections to be used for collection includes
                foreach (var include in qb.Value.Includes)//.Where(inc => !(inc is IIncludeInCollectionDirective)))
                {
                    IRequestedBinding targetBinding = qb;
                    foreach (MemberExpression member in GetMembers(include.GetSelector().Body as MemberExpression))
                    {
                        var existingBinding = getExistingBinding(member);
                        if (existingBinding != null)
                        {
                            targetBinding = existingBinding;
                        }
                        else
                        {
                            var includeDirective  = getIncludeDirective(member);
                            var currentMemberName = (targetBinding is QueryBinding)
                                ? (targetBinding as QueryBinding).Value.GetMemberName(member.Member) : member.Member.Name;
                            var binding = new IncludeBinding()
                            {
                                IncludeDirective     = includeDirective,
                                TargetBinding        = targetBinding,
                                TranslatedExpression = typeTranslationUtil.GetTranslatedMemberExpression
                                                           (member.Expression.Type, currentMemberName, targetBinding.TranslatedExpression)
                            };
                            bindings.Add(binding);
                            targetBinding = binding;
                        }
                    }
                }
                foreach (var collInclude in qb.Value.Includes.Where(inc => inc is IIncludeInCollectionDirective))
                {
                    var collectionSelector = collInclude.GetSelector().Body as MemberExpression;

                    var target = getExistingBinding(collectionSelector);
                    if (target != null)
                    {
                        bindings.Add(new UnprojectedIncludeInCollectionBinding
                        {
                            IncludeDirective = collInclude,
                            TargetBinding    = target
                        });
                    }
                }
            }
            return(bindings);
        }