using Ant.Core; using Ant.Core.Visitors; using Ant.Data; using Ant.Infrastructure; using Ant.Mapper; using Ant.ORM; using Ant.Query.Mapping; using Ant.Query.QueryState; using Ant.Query.Visitors; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Diagnostics; namespace Ant.Query.Internals { class InternalQuery : IEnumerable, IEnumerable { Queryable _query; DbCommandFactor _commandFactor; internal InternalQuery(Queryable query) { this._query = query; this._commandFactor = GenerateCommandFactor(); } /// /// 创建执行SQL语句的工厂 /// /// DbCommandFactor GenerateCommandFactor() { IQueryState qs = QueryExpressionVisitor.VisitQueryExpression(this._query.QueryExpression); MappingData data = qs.GenerateMappingData();//解析Lambda表达式 IObjectActivator objectActivator; if (this._query._trackEntity) objectActivator = data.ObjectActivatorCreator.CreateObjectActivator(this._query.DbContext); else objectActivator = data.ObjectActivatorCreator.CreateObjectActivator(); IDbExpressionTranslator translator = this._query.DbContext.DbContextServiceProvider.CreateDbExpressionTranslator(); List parameters; string cmdText = translator.Translate(data.SqlQuery, out parameters);//解析SQL语句 DbCommandFactor commandFactor = new DbCommandFactor(objectActivator, cmdText, parameters.ToArray()); commandFactor.StrSql = SqlDataAccess.AppendDbCommandInfo(cmdText, parameters.ToArray()); commandFactor.SqlConnection = this._query.db.ConnectionString; return commandFactor; } /// /// /// /// public IEnumerator GetEnumerator() { // DbCommandFactor commandFactor = this.GenerateCommandFactor(); var enumerator = QueryEnumeratorCreator.CreateEnumerator(this._query.db, _commandFactor);//用于返回数据对象 return enumerator; } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } /// /// 为了获取SQL语句 /// /// public override string ToString() { //DbCommandFactor commandFactor = this.GenerateCommandFactor(); return SqlDataAccess.AppendDbCommandInfo(_commandFactor.CommandText, _commandFactor.Parameters);//返回SQL语句用于记日志; } /// /// 获取数据库连接 /// /// public string GetDataConnection() { return _commandFactor.SqlConnection; } } }