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); }
/// <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; } }
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); } }
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(); }
/// <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); }
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); } }