Пример #1
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);
        }
Пример #2
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);
        }