internal static DMS <TResult> Join <T, T1, TGroupBy, TOrderBy, TResult>(this DMS <T> outer, DMSJoinType JoinType, DMS <T1> inner, Expression <Func <T, T1, bool> > whereFunc, Expression <Func <T, T1, TResult> > selector, Expression <Func <T, T1, TGroupBy> > groupby, Expression <Func <T, T1, bool> > having, Expression <Func <T, T1, TOrderBy> > orderby) where T : class where T1 : class where TGroupBy : class where TOrderBy : class where TResult : class { DMS <TResult> result = Join(outer, JoinType, inner, whereFunc, selector); if (groupby != null) { result.GroupByExpression.Append <T, T1, TGroupBy>(groupby); } if (orderby != null) { result.OrderByExpressioin.Append <T, T1, TOrderBy>(orderby); } if (having != null) { if (groupby == null) { Log.Debug(ReflectionUtils.GetMethodBaseInfo(System.Reflection.MethodBase.GetCurrentMethod()), "分组条件必须要先有分组", null); throw new DMSFrameException("分组条件必须要先有分组"); } result.HavingExpression.Append <T, T1>(having); } return(result); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="T1"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="dms"></param> /// <param name="JoinType"></param> /// <param name="inner"></param> /// <param name="whereFunc"></param> /// <param name="selector"></param> /// <returns></returns> internal static DMS <TResult> Join <T, T1, TResult>(this DMS <T> dms, DMSJoinType JoinType, DMS <T1> inner, Expression <Func <T, T1, bool> > whereFunc, Expression <Func <T, T1, TResult> > selector) where T : class where T1 : class where TResult : class { if (dms.ExpressionParserChangedFlag) { if (dms.ColumnsExpressioin.Expression == null) { ////防止没有SELECT的现象 ParameterExpression xExpr = Expression.Parameter(dms.DataType, "x"); LambdaExpression lambdaExpr = Expression.Lambda(xExpr, xExpr); dms.ColumnsExpressioin.Append(lambdaExpr); } AnalyzeExpressionSelectPacker <T, T>(dms); } else { //if (dms.TableExpressioin.TableKeys != null) //{ // DMSTableKeys lastTableKeys = dms.TableExpressioin.TableKeys.LastOrDefault(); // if (lastTableKeys.AssemblyQualifiedName != typeof(T).AssemblyQualifiedName) // { // dms.SplitExpression.AnalyzeExpressionSelectPacker(lastTableKeys.TableSpecialName, typeof(T)); // } //} } DMS <TResult> result = new DMS <TResult>(dms); if (typeof(T).Name.StartsWith("<>f__AnonymousType")) { Expression <Func <object, object> > As = q => dms.Provider.As; result.TableExpressioin.Append(As); result.TableExpressioin.Append <T, T>(item => item); } else { //result.TableExpressioin.Append<TResult, TResult>(item => item); } switch (JoinType) { case DMSJoinType.INNERJOIN: default: Expression <Func <string, string> > InnerJoin0 = q => dms.Provider.InnerJoin; result.TableExpressioin.Append(InnerJoin0); break; case DMSJoinType.LEFTJOIN: Expression <Func <string, string> > InnerJoin1 = q => dms.Provider.LeftJoin; result.TableExpressioin.Append(InnerJoin1); break; case DMSJoinType.RIGHTJOIN: Expression <Func <string, string> > InnerJoin2 = q => dms.Provider.RightJoin; result.TableExpressioin.Append(InnerJoin2); break; } if (inner.ExpressionParserChangedFlag) { Log.Debug(ReflectionUtils.GetMethodBaseInfo(System.Reflection.MethodBase.GetCurrentMethod()), "暂不支持后面的表有条件限制", null); throw new DMSFrameException("暂不支持后面的表有条件限制"); } else { if (!string.IsNullOrEmpty(inner.TableExpressioin.bDataBase)) { DMSDataBase myDb = new DMSDataBase(inner.TableExpressioin.bDataBase); result.TableExpressioin.Append <string, DMSDataBase>(q => myDb); } Expression <Func <T1, T1> > innerTable = q => q; result.TableExpressioin.Append(innerTable); } Expression <Func <string, string> > On = q => dms.Provider.On; result.TableExpressioin.Append(On); result.WhereExpressioin.Append <T, T1>(whereFunc); result.ColumnsExpressioin.Append <T, T1, TResult>(selector); result.TableExpressioin.JoinFlag = true; return(result); }