DMSLinq表达式框架实现(五) DMSTableExpression实现
2012-05-14 22:56
155 查看
/// <summary> /// 表的表达式处理实现 /// </summary> public class DMSTableExpression : DMSExpressionVisitor, IDMSTableExpressionParser { /// <summary> /// /// </summary> public IDMSDbProvider DbProvider { get; set; } private List<SingleTableExpression> SingleExpression { get; set; } /// <summary> /// /// </summary> public Expression DMSExpression { get; set; } /// <summary> /// /// </summary> public Dictionary<string, string> KeyValue { get; set; } /// <summary> /// /// </summary> public Dictionary<string, string> TableNameAlias { get; set; } private StringBuilder _ResultSql = new StringBuilder(); /// <summary> /// /// </summary> /// <param name="keyTable"></param> /// <returns></returns> public string AnalyzeExpression(ref Dictionary<string, string> keyTable) { this._ResultSql = new StringBuilder(); if (DMSExpression != null) { this.Visit(DMSExpression); } keyTable = this.KeyValue; if (keyTable.Count > 0) { string lastKey = keyTable.Last().Key; if (TableNameAlias.ContainsKey(lastKey)) { keyTable[lastKey] = TableNameAlias[lastKey]; } } return this._ResultSql.ToString(); } private bool IsAs = true; /// <summary> /// /// </summary> /// <returns></returns> public string AnalyzeExpression() { this._ResultSql = new StringBuilder(); this.IsAs = false; if (DMSExpression != null) { this.Visit(DMSExpression); } return this._ResultSql.ToString(); } /// <summary> /// /// </summary> /// <param name="dms"></param> /// <param name="type"></param> public void Append(IDMSBase dms, Type type) { if (this.KeyValue == null) KeyValue = new Dictionary<string, string>(); if (SingleExpression == null) SingleExpression = new List<SingleTableExpression>(); if (TableNameAlias == null) TableNameAlias = new Dictionary<string, string>(); if (typeof(DMSWhere) == type || typeof(DMSOn) == type || typeof(DMSSelect) == type) { if (SingleExpression.Find(q => q.Key == dms.CurrentType && q.TableType == type) != null) { return; } SingleExpression.Add(new SingleTableExpression() { Key = dms.CurrentType, TableType = type }); } if (!type.IsGenericType && type.IsClass) { NewArrayExpression newArrayExpression = Expression.NewArrayInit(typeof(object), Expression.New(type)); if (this.DMSExpression != null) { NewArrayExpression newArrayExpression2 = this.DMSExpression as NewArrayExpression; IEnumerable<Expression> initializers2 = newArrayExpression2.Expressions.Concat(newArrayExpression.Expressions); newArrayExpression = Expression.NewArrayInit(typeof(object), initializers2); this.DMSExpression = dms.ModifyExpression(newArrayExpression); } else { this.DMSExpression = dms.ModifyExpression(newArrayExpression); } } else { NewArrayExpression newArrayExpression = Expression.NewArrayInit(typeof(object), Expression.Constant(type.ToString())); if (this.DMSExpression != null) { Expression exp = this.DMSExpression; NewArrayExpression newArrayExpression2 = exp as NewArrayExpression; if (newArrayExpression2 != null) { IEnumerable<Expression> initializers2 = newArrayExpression2.Expressions.Concat(newArrayExpression.Expressions); newArrayExpression = Expression.NewArrayInit(typeof(object), initializers2); this.DMSExpression = dms.ModifyExpression(newArrayExpression); } } else { this.DMSExpression = dms.ModifyExpression(newArrayExpression); } } } /// <summary> /// /// </summary> /// <param name="nex"></param> /// <returns></returns> protected override NewExpression VisitNew(NewExpression nex) { Type type = nex.Type; if (!type.IsGenericType && type.IsClass) { AdjustConstant(type); } #region MyRegion //else //{ // foreach (Expression exp in nex.Arguments) // { // this.Visit(exp); // if (!this._ResultSql.ToString().EndsWith(",")) // { // this._ResultSql.Append(","); // } // } // if (this._ResultSql.ToString().EndsWith(",")) // { // this._ResultSql.Remove(this._ResultSql.Length - 1, 1); // } // this._ResultSql.Append(" "); //} #endregion return nex; } private void AdjustConstant(Type type) { string text = string.Empty; bool IsEntity = false; //是否是IEntity if (type.GetInterface(typeof(IEntity).FullName, false) != null) { if (!this.KeyValue.ContainsKey(type.ToString())) { string AliasName = "t" + this.KeyValue.Count; if (TableNameAlias.ContainsKey(type.ToString())) { AliasName = TableNameAlias[type.ToString()]; } this.KeyValue.Add(type.ToString(), AliasName); } text = type.GetEntityName(); if (string.IsNullOrEmpty(text)) { text = type.Name; } IsEntity = true; } else if (type.GetInterface(typeof(IDMSParser).FullName, false) != null)//是否是IDMSParser { text = type.GetDMSName(); if (type == typeof(DMSSelect)) { text = ""; } } else { if (!this.KeyValue.ContainsKey(type.ToString())) { string AliasName = "t" + this.KeyValue.Count; if (TableNameAlias.ContainsKey(type.ToString())) { AliasName = TableNameAlias[type.ToString()]; } this.KeyValue.Add(type.ToString(), AliasName); } } if (!string.IsNullOrEmpty(text) && this.DbProvider != null && type.GetInterface(typeof(IDMSParser).FullName, false) == null) { text = this.DbProvider.BuildTableName(text); } this._ResultSql.Append(text); if (IsEntity && IsAs) { this._ResultSql.Append(" AS "); text = this.KeyValue[type.ToString()]; if (!string.IsNullOrEmpty(text) && this.DbProvider != null) { text = this.DbProvider.BuildTableName(text); } this._ResultSql.Append(text); } this._ResultSql.Append(" "); } /// <summary> /// /// </summary> /// <param name="c"></param> /// <returns></returns> protected override Expression VisitConstant(ConstantExpression c) { if (c.Value != null) { if (c.Type.IsArray) { Array array = c.Value as Array; foreach (object current in array) { if (current != null) { Type type = current.GetType(); if (type == typeof(string)) { if (!this.KeyValue.ContainsKey(current.ToString())) { string AliasName = "t" + this.KeyValue.Count; if (this.TableNameAlias.ContainsKey(current.ToString())) { AliasName = this.TableNameAlias[current.ToString()]; } this.KeyValue.Add(current.ToString(), AliasName); } } else { AdjustConstant(type); } } } } else { if (!this.KeyValue.ContainsKey(c.Value.ToString())) { this.KeyValue.Add(c.Value.ToString(), "t" + this.KeyValue.Count); } } } return base.VisitConstant(c); } /// <summary> /// /// </summary> /// <param name="na"></param> /// <returns></returns> protected override Expression VisitNewArray(NewArrayExpression na) { foreach (Expression current in na.Expressions) { this.Visit(current); this._ResultSql.Append(" "); } return na; } }
相关文章推荐
- DMSLinq表达式框架实现(一)
- DMSLinq表达式框架实现(六)
- DMSLinq表达式框架实现(总)
- DMSLinq表达式框架实现(四)
- DMSLinq表达式框架实现(三)
- DMSLinq表达式框架实现(二)
- ASP EF框架,部分列查询。linq表达式和lamb表达式两种方式实现
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十五节--缓存小结与ABP框架项目中 Redis Cache的实现
- .NET深入解析LINQ框架(六:LINQ执行表达式)
- JavaScript和CSS通过expression实现Table居中显示
- Linq之Expression高级篇(常用表达式类型)
- C#基于Linq和反射实现数据持久化框架Xml4DB
- 项目框架搭建 FrameLayout+RadioGroup+TableLayout+ 实现复杂界面布局
- 通用表表达式(Common Table Expression)
- Quartz 框架和cron表达式任务调度的例子(spring下实现定时发送邮件)
- 类Shiro权限校验框架的设计和实现(2)--对复杂权限表达式的支持
- 基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理
- JavaScript和CSS通过expression实现Table居中显示
- 样式表达式实现交替显示table行颜色
- 嵌套表表达式(Nested Table Expression)