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