Example #1
0
        public QueryCommand <TEntity> Where(Expression <Func <TEntity, bool> > exp)
        {
            var retData = new ExpressionAnalyzer(exp).GetAnalysisResult();

            _creator.CreateWhere(retData);
            _params = retData.ParamList;
            _table  = retData.Table;
            return(this);
        }
Example #2
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 #3
0
 private void AppendLeftJoinTables(AnalysisTable anlyTable, TableInfo tableInfo, StringBuilder sb)
 {
     ///添加关系表信息
     foreach (var item in anlyTable.LeftJoins)
     {
         var _foreignRef = GetForeignReference(tableInfo, item.RName);
         if (string.IsNullOrEmpty(_foreignRef.Key))
         {
             // throw new BusinessException(BusinessRes.WhitoutThisForeignReference);
             throw new Exception("foreign key");
         }
         sb.AppendFormat(" LEFT JOIN [{0}] AS [{1}] ON [{1}].{2}=[{3}].{4} ", item.Name, item.RName, _foreignRef.Value.PrimaryKey, anlyTable.RName, _foreignRef.Key);
         AppendLeftJoinTables(item, _foreignRef.Value, sb);
     }
 }
Example #4
0
        public virtual void CreateFrom(AnalysisTable anlyTable, TableInfo tableInfo)
        {
            if (null == anlyTable)
            {
                throw new ArgumentNullException("anlyTable");
            }
            //默认排序信息
            if (string.IsNullOrEmpty(Debris.Order))
            {
                Debris.Order = string.Format("[{0}].{1} {2}", anlyTable.RName, tableInfo.PrimaryKey, System.Enum.GetName(typeof(OrderTypeEnum), OrderTypeEnum.ASC));
            }
            StringBuilder sb = new StringBuilder();

            sb.AppendFormat("[{0}] AS [{1}]", anlyTable.Name, anlyTable.RName);
            AppendLeftJoinTables(anlyTable, tableInfo, sb);
            Debris.From = sb.ToString();
        }
Example #5
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);
        }
Example #6
0
        public ExpressionAnalyzer(LambdaExpression exp, AnalysisTable table = null)
            : this()
        {
            if (table != null)
            {
                _resultData.Table = table;
            }

            if (exp != null)
            {
                AppendParams(GetChildValue(exp.Body), _params);
                foreach (var item in exp.Parameters)
                {
                    AnalysisTables(item);
                }
                AnalysisExpression(exp.Body, true);
            }
        }