/// <summary> /// Generates a relationship query between two table /// </summary> /// <typeparam name="T">The type of left table</typeparam> /// <typeparam name="TOther">The type of right table</typeparam> /// <param name="leftTableColumn">The column of left table</param> /// <param name="rightOtherTableColumn">The column of right table</param> /// <returns></returns> public static IQuery <TOther> JoinWith <T, TOther>(this IQuery <T> query, Expression <Func <T, object> > leftTableColumn, Expression <Func <TOther, object> > rightOtherTableColumn) { IQuery <TOther> result = Activator.CreateInstance(typeof(Entity <TOther>), args: query.ConnectionString) as Entity <TOther>; result.FromStatement += query.FromStatement; result.WhereStatement.Append(query.WhereStatement); result.JoinStatement.Append(query.JoinStatement); result.OrderByAscendingStatement.Append(query.OrderByAscendingStatement); result.OrderByDescendingStatement.Append(query.OrderByDescendingStatement); result.SkipCount = query.SkipCount; result.TakeCount = query.TakeCount; JoinExpressionResult joinExpression = ExpressionUtil.GetJoinExpression <TOther>(rightOtherTableColumn.Body); joinExpression.FromColumnName = ExpressionUtil.GetJoinExpression <T>(leftTableColumn).ColumnName; query.JoinStatement.Append(" JOIN "); query.JoinStatement.Append(joinExpression.TableName); query.JoinStatement.Append(" "); query.JoinStatement.Append(joinExpression.TableName.ToLower()); query.JoinStatement.Append(" ON "); query.JoinStatement.Append(typeof(T).Name.ToLower()); query.JoinStatement.Append("."); query.JoinStatement.Append(joinExpression.FromColumnName); query.JoinStatement.Append(" = "); query.JoinStatement.Append(joinExpression.TableName.ToLower()); query.JoinStatement.Append("."); query.JoinStatement.Append(joinExpression.ColumnName); result.JoinStatement.Append(query.JoinStatement); return(result); }
/// <summary> /// Generates a relationship query between two table /// </summary> /// <typeparam name="TRight">The type of right table</typeparam> /// <param name="rightExpression">The expression of right table</param> /// <returns></returns> public static JoinExpressionResult GetJoinExpression <TRight>(object rightExpression) { JoinExpressionResult joinExpressionResult = new JoinExpressionResult(); if (rightExpression is LambdaExpression) { LambdaExpression lambdaExpression = rightExpression as LambdaExpression; if (lambdaExpression.Body is MemberExpression) { MemberExpression memberExpression = lambdaExpression.Body as MemberExpression; joinExpressionResult.TableName = typeof(TRight).Name; joinExpressionResult.ColumnName = memberExpression.Member.Name; } else if (lambdaExpression.Body is UnaryExpression) { UnaryExpression unaryExpression = lambdaExpression.Body as UnaryExpression; if (unaryExpression.Operand is MemberExpression) { MemberExpression memberExpression = unaryExpression.Operand as MemberExpression; joinExpressionResult.TableName = typeof(TRight).Name; joinExpressionResult.ColumnName = memberExpression.Member.Name; } } } else if (rightExpression is MemberExpression) { MemberExpression memberExpression = rightExpression as MemberExpression; if (memberExpression.NodeType == ExpressionType.MemberAccess) { joinExpressionResult.TableName = typeof(TRight).Name; joinExpressionResult.ColumnName = memberExpression.Member.Name; } else if (memberExpression.NodeType == ExpressionType.Convert) { joinExpressionResult.TableName = typeof(TRight).Name; joinExpressionResult.ColumnName = ""; } } else if (rightExpression is UnaryExpression) { UnaryExpression unaryExpression = rightExpression as UnaryExpression; if (unaryExpression.Operand is MemberExpression) { MemberExpression memberExpression = unaryExpression.Operand as MemberExpression; joinExpressionResult.TableName = typeof(TRight).Name; joinExpressionResult.ColumnName = memberExpression.Member.Name; } } return(joinExpressionResult); }