예제 #1
0
        /// <summary>
        /// 根据指定类型<see cref="DbCollectionMemberExpression"/>表达式创建数据源语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="expression">指定表达式。</param>
        /// <returns>创建结果。</returns>
        protected virtual ISourceFragment CreateSourceForCollectionMember(GenerateContext context, DbExpression expression)
        {
            var content       = (DbCollectionMemberExpression)expression;
            var source        = GetSource(context, content.Expression);
            var target        = CreateSource(context, content.TargetSet);
            var container     = (SelectFragment)source.Parent;
            var virtualSource = new VirtualSourceFragment(context, expression, container, source);

            context.RegisterSource(content, virtualSource);
            return(virtualSource);
        }
예제 #2
0
        /// <summary>
        /// 根据指定类型<see cref="DbGroupJoinExpression"/>表达式创建数据源语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="expression">指定表达式。</param>
        /// <returns>创建结果。</returns>
        protected virtual ISourceFragment CreateSourceForGroupJoin(GenerateContext context, DbExpression expression)
        {
            var content       = (DbGroupJoinExpression)expression;
            var source        = CreateSource(context, content.Source);
            var taget         = CreateSource(context, content.Target);
            var container     = new SelectFragment(context, source);
            var virtualSource = new VirtualSourceFragment(context, expression, container, source);

            context.RegisterSource(content.Item, virtualSource);
            if (IsSelectFragment(content))
            {
                return(InitialSelectFragment(container, content));
            }
            return(container);
        }
예제 #3
0
        //生成集合成员虚拟数据源连接。
        private void GenerateVirtualJoinForCollectionMember(GenerateContext context, VirtualSourceFragment source, ISourceFragment body, bool iscomposite)
        {
            var content   = (DbCollectionMemberExpression)source.Expression;
            var container = source.Container;

            if (container.IsRecommandLock)
            {
                container = container.Parent as SelectFragment;
            }
            body.Join = EJoinType.LeftJoin;
            var pairs = content.Pairs;

            if (content.Metadata.IsComposite && iscomposite)
            {
                pairs = content.CompositePairs;
            }
            body.Condition = pairs.Select(a => container.CreateExpression(a)).Merge();
        }
예제 #4
0
        /// <summary>
        /// 根据指定类型<see cref="DbGroupByExpression"/>表达式创建数据源语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="expression">指定表达式。</param>
        /// <returns>创建结果。</returns>
        protected virtual ISourceFragment CreateSourceForGroupBy(GenerateContext context, DbExpression expression)
        {
            var content   = (DbGroupByExpression)expression;
            var groupitem = (DbGroupItemExpression)content.Item;
            var source    = CreateSource(context, content.Source);
            var body      = new SelectFragment(context, source);

            body.RetrievalMembers(content.Key, false);
            foreach (var member in body.Members.OfType <ReferenceMemberFragment>())
            {
                body.GroupBys.Add(member.Reference);
            }
            var container     = new SelectFragment(context, body);
            var virtualSource = new VirtualSourceFragment(context, expression, container, source, body);

            context.RegisterSource(content, virtualSource);
            context.RegisterSource(content.Item, virtualSource);
            return(container);
        }
예제 #5
0
 /// <summary>
 /// 根据指定类型<see cref="DbGroupByExpression"/>表达式创建虚拟数据源连接语句片段。
 /// </summary>
 /// <param name="context">生成上下文。</param>
 /// <param name="expression">表达式。</param>
 /// <param name="source">虚拟数据源</param>
 /// <returns>查询语句片段。</returns>
 public virtual SourceFragment CreateVirtualJoinForGroupBy(GenerateContext context, DbCrossJoinExpression expression, VirtualSourceFragment source)
 {
     throw new NotImplementedException();
 }
예제 #6
0
        /// <summary>
        /// 根据指定类型<see cref="DbGroupByExpression"/>表达式创建虚拟数据源列表语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="source">虚拟数据源</param>
        /// <returns>查询语句片段。</returns>
        public virtual SelectFragment CreateVirtualListForGroupBy(GenerateContext context, VirtualSourceFragment source)
        {
            var content = (DbGroupByExpression)source.Expression;
            var target  = source.Source;

            var body      = source.GetBody();
            var list      = new SelectFragment(context, target);
            var container = source.Container;

            if (container.IsRecommandLock)
            {
                container = container.Parent as SelectFragment;
            }
            container.AddSource(list);
            list.RetrievalMembers(content.Source.Item, false);

            list.Join      = EJoinType.InnerJoin;
            list.Condition = body.Members.OfType <ReferenceMemberFragment>().Select(member =>
            {
                var left = list.Members.OfType <ReferenceMemberFragment>().Where(a => a.Reference == member.Reference).Single();
                return(new BinaryFragment(context, EBinaryKind.Equal)
                {
                    Left = left,
                    Right = ValidateMember(context, member, container, null, true)
                });
            }).Merge();
            return(list);
        }
예제 #7
0
        /// <summary>
        /// 根据指定类型<see cref="DbGroupJoinExpression"/>表达式创建虚拟数据源连接语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="expression">表达式。</param>
        /// <param name="source">虚拟数据源</param>
        /// <returns>查询语句片段。</returns>
        public virtual ISourceFragment CreateVirtualJoinForGroupJoin(GenerateContext context, DbCrossJoinExpression expression, VirtualSourceFragment source)
        {
            var content  = (DbGroupJoinExpression)source.Expression;
            var groupset = (DbGroupSetExpression)expression.Target;

            var target = GetSource(context, content.Target.Item);

            context.RegisterSource(expression.Target.Item, target);

            var joinBody  = target;
            var container = source.Container;

            container.AddSource(target);
            joinBody.Join      = groupset.Default == null ? EJoinType.InnerJoin : EJoinType.LeftJoin;
            joinBody.Condition = content.KeyPairs.Select(a => container.CreateExpression(a)).Merge();
            return(joinBody);
        }
예제 #8
0
        /// <summary>
        /// 根据指定类型<see cref="DbGroupJoinExpression"/>表达式创建虚拟数据源列表语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="source">虚拟数据源</param>
        /// <returns>查询语句片段。</returns>
        public virtual SelectFragment CreateVirtualListForGroupJoin(GenerateContext context, VirtualSourceFragment source)
        {
            var content = (DbGroupJoinExpression)source.Expression;
            var target  = GetSource(context, content.Target.Item);

            var list      = new SelectFragment(context, target);
            var container = source.Container;

            if (container.IsRecommandLock)
            {
                container = container.Parent as SelectFragment;
            }
            container.AddSource(list);

            list.Join      = EJoinType.LeftJoin;
            list.Condition = content.KeyPairs.Select(a => container.CreateExpression(a)).Merge();
            list.RetrievalMembers(content.Target.Item, false);
            return(list);
        }
예제 #9
0
        /// <summary>
        /// 根据指定类型<see cref="DbGroupJoinExpression"/>表达式创建虚拟数据源主体语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="source">虚拟数据源</param>
        /// <returns>查询语句片段。</returns>
        public virtual SelectFragment CreateVirtualBodyForGroupJoin(GenerateContext context, VirtualSourceFragment source)
        {
            var content = (DbGroupJoinExpression)source.Expression;

            var target = GetSource(context, content.Target.Item);

            var body      = new SelectFragment(context, target);
            var container = source.Container;

            container.AddSource(body);

            body.Join      = EJoinType.LeftJoin;
            body.Condition = content.KeyPairs.Select(a =>
            {
                body.GroupBys.Add(body.RetrievalMember(a.Right));
                return(container.CreateExpression(a));
            }).Merge();
            return(body);
        }
예제 #10
0
        /// <summary>
        /// 根据指定类型<see cref="DbCollectionMemberExpression"/>表达式创建虚拟数据源连接语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="expression">表达式。</param>
        /// <param name="source">虚拟数据源</param>
        /// <returns>查询语句片段。</returns>
        public virtual ISourceFragment CreateVirtualJoinForCollectionMember(GenerateContext context, DbCrossJoinExpression expression, VirtualSourceFragment source)
        {
            var content   = (DbCollectionMemberExpression)source.Expression;
            var target    = GetSource(context, content.TargetSet.Item);
            var container = source.Container;

            if (content.Metadata.IsComposite)
            {
                var relationSet = GenerateVirtualCompositeJoinForCollectionMember(context, content, container, false);
                relationSet.Join = content.Default == null ? EJoinType.InnerJoin : EJoinType.LeftJoin;
            }
            container.AddSource(target);
            GenerateVirtualJoinForCollectionMember(context, source, target, true);
            if (content.Metadata.IsComposite)
            {
                target.Join = EJoinType.InnerJoin;
            }
            else
            {
                target.Join = content.Default == null ? EJoinType.InnerJoin : EJoinType.LeftJoin;
            }
            context.RegisterSource(content.Item, target);
            return(target);
        }
예제 #11
0
        /// <summary>
        /// 根据指定类型<see cref="DbCollectionMemberExpression"/>表达式创建虚拟数据源列表语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="source">虚拟数据源</param>
        /// <returns>查询语句片段。</returns>
        public virtual SelectFragment CreateVirtualListForCollectionMember(GenerateContext context, VirtualSourceFragment source)
        {
            var content   = (DbCollectionMemberExpression)source.Expression;
            var target    = GetSource(context, content.TargetSet.Item);
            var container = source.Container;

            if (container.IsRecommandLock)
            {
                container = container.Parent as SelectFragment;
            }
            var list = new SelectFragment(context, target);

            if (content.Metadata.IsComposite)
            {
                GenerateVirtualCompositeJoinForCollectionMember(context, content, list, true);
            }
            container.AddSource(list);

            GenerateVirtualJoinForCollectionMember(context, source, list, false);
            list.RetrievalMembers(content.TargetSet.Item, false);
            if (IsSelectFragment(content))
            {
                context.RegisterTempSource(content.Item, target, delegate()
                {
                    list = InitialSelectFragment(list, content);
                });
            }
            return(list);
        }
예제 #12
0
        /// <summary>
        /// 根据指定类型<see cref="DbCollectionMemberExpression"/>表达式创建虚拟数据源主体语句片段。
        /// </summary>
        /// <param name="context">生成上下文。</param>
        /// <param name="source">虚拟数据源</param>
        /// <returns>查询语句片段。</returns>
        public virtual SelectFragment CreateVirtualBodyForCollectionMember(GenerateContext context, VirtualSourceFragment source)
        {
            var content   = (DbCollectionMemberExpression)source.Expression;
            var target    = GetSource(context, content.TargetSet.Item);
            var container = source.Container;
            var body      = new SelectFragment(context, target);

            if (content.Metadata.IsComposite)
            {
                GenerateVirtualCompositeJoinForCollectionMember(context, content, body, true);
            }
            container.AddSource(body);

            GenerateVirtualJoinForCollectionMember(context, source, body, false);
            foreach (var a in content.Pairs)
            {
                body.GroupBys.Add(body.RetrievalMember(a.Left));
            }
            return(body);
        }