Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }