/// <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); }
/// <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); }
//生成集合成员虚拟数据源连接。 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(); }
/// <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); }
/// <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(); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }