/// <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="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); }