Esempio n. 1
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);
        }