Example #1
0
        /// <summary>
        /// 解析表信息
        /// </summary>
        /// <param name="exp"></param>
        /// <param name="refTable">引用表</param>
        private void AnalysisTables(Expression exp, AnalysisTable refTable = null)
        {
            var className = exp.GetType().Name;

            switch (className)
            {
            case "PropertyExpression":
            case "FieldExpression":
                var mberExp = exp as MemberExpression;
                if (IsDefaultType(mberExp.Type))
                {
                    AnalysisTables(mberExp.Expression);
                    break;
                }
                var _tampTab = GetTableByRName(resultData.Table, mberExp.Member.Name);
                if (_tampTab == null)
                {
                    _tampTab = new AnalysisTable()
                    {
                        RName     = mberExp.Member.Name,
                        Name      = mberExp.Type.Name,
                        TableType = mberExp.Type
                    };
                    AnalysisTables(mberExp.Expression, _tampTab);
                }
                if (refTable != null)
                {
                    _tampTab.LeftJoins.Add(refTable);
                }
                break;

            case "TypedParameterExpression":
                //命名参数表达式
                var texp = exp as ParameterExpression;
                if (!IsDefaultType(texp.Type))
                {
                    if (null == resultData.Table)
                    {
                        resultData.Table = new AnalysisTable()
                        {
                            RName     = argName,
                            Name      = texp.Type.Name,
                            TableType = texp.Type
                        };
                    }
                    if (refTable != null)
                    {
                        resultData.Table.LeftJoins.Add(refTable);
                    }
                }
                break;

            default:
                break;
            }
        }
Example #2
0
        public ExpressionAnalyzer(LambdaExpression exp, AnalysisTable table = null)
            : this()
        {
            if (table != null)
            {
                resultData.Table = table;
            }

            if (exp != null)
            {
                AppendParams(GetChildValue(exp.Body), parameters);
                foreach (var item in exp.Parameters)
                {
                    AnalysisTables(item);
                }
                AnalysisExpression(exp.Body, true);
            }
        }
Example #3
0
        /// <summary>
        /// 遍历树,深度优先
        /// </summary>
        /// <param name="table"></param>
        /// <param name="rName"></param>
        /// <returns></returns>
        private AnalysisTable GetTableByRName(AnalysisTable table, string rName)
        {
            var _tempTable = table;

            if (_tempTable.RName == rName)
            {
                return(_tempTable);
            }
            foreach (var item in _tempTable.LeftJoins)
            {
                _tempTable = GetTableByRName(item, rName);
                if (_tempTable != null)
                {
                    return(_tempTable);
                }
            }
            return(null);
        }