using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using Ant.Core; using Ant.Query.QueryExpressions; using Ant.Infrastructure; using Ant.Query.Internals; using System.Diagnostics; using Ant.Utility; using System.Reflection; using Ant.DbExpressions; using Ant.ORM; using Ant.ORM; using Ant.Common; using Ant.Data; using Ant.Frame; namespace Ant.Query { class Queryable : QueryBase, IQuery { static readonly List EmptyParameterList = new List(0); AntORM _dbContext; QueryExpression _expression; internal bool _trackEntity = false;//是否开启跟踪 public AntORM DbContext { get { return this._dbContext; } }//数据库连接 public static Stopwatch sw = new Stopwatch(); public Queryable(AntORM dbContext) : this(dbContext, new RootQueryExpression(typeof(T)), false) { if (!sw.IsRunning) { sw = new Stopwatch(); sw.Start(); } //这边可以用于开始记时 } public Queryable(AntORM dbContext, QueryExpression exp) : this(dbContext, exp, false) { if (!sw.IsRunning) { sw = new Stopwatch(); sw.Start(); } } public Queryable(AntORM dbContext, QueryExpression exp, bool trackEntity) { if (!sw.IsRunning) { sw = new Stopwatch(); sw.Start(); } this._dbContext = dbContext; this._expression = exp; this._trackEntity = trackEntity; } /// /// 数据库配置 /// public DataAccess db { get; set; } /// /// 显示列 /// /// /// /// public IQuery Select(Expression> selector) { AntUtils.CheckNull(selector); SelectExpression e = new SelectExpression(typeof(TResult), _expression, selector); return new Queryable(this._dbContext, e, this._trackEntity); } /// /// 查询条件 /// /// /// public IQuery Where(Expression> predicate) { AntUtils.CheckNull(predicate); WhereExpression e = new WhereExpression(_expression, typeof(T), predicate); return new Queryable(this._dbContext, e, this._trackEntity); } /// /// 用IN作为查询条件的SQL语句 /// /// /// /// public IQuery WhereIn(Expression> propertySelector, params object[] values) { return this.Where(BuildWhereInExpression(propertySelector, values)); } /// /// /// /// /// /// /// /// private Expression> BuildWhereInExpression(Expression> propertySelector, IEnumerable values) { ParameterExpression p = propertySelector.Parameters.Single(); if (!values.Any()) return e => false; var equals = values.Select(value => (Expression)Expression.Equal(propertySelector.Body, Expression.Constant(value, typeof(object)))); var body = equals.Aggregate((accumulate, equal) => Expression.Or(accumulate, equal)); return Expression.Lambda>(body, p); } /// /// 默认升序排序 /// /// /// /// public IOrderedQuery OrderBy(Expression> predicate) { AntUtils.CheckNull(predicate); OrderExpression e = new OrderExpression(QueryExpressionType.OrderBy, typeof(T), this._expression, predicate); return new OrderedQuery(this._dbContext, e, this._trackEntity); } /// /// 降序排序 /// /// /// /// public IOrderedQuery OrderByDesc(Expression> predicate) { AntUtils.CheckNull(predicate); OrderExpression e = new OrderExpression(QueryExpressionType.OrderByDesc, typeof(T), this._expression, predicate); return new OrderedQuery(this._dbContext, e, this._trackEntity); } /// /// 跳过 /// /// /// public IQuery Skip(int count) { SkipExpression e = new SkipExpression(typeof(T), this._expression, count); return new Queryable(this._dbContext, e, this._trackEntity); } /// /// TOP取条数据 /// /// /// public IQuery Top(int count) { TakeExpression e = new TakeExpression(typeof(T), this._expression, count); return new Queryable(this._dbContext, e, this._trackEntity); } /// /// 分组 /// /// /// /// public IGroupingQuery GroupBy(Expression> predicate) { AntUtils.CheckNull(predicate); return new GroupingQuery(this, predicate); } /// /// 内连接 /// /// /// /// /// public IJoiningQuery InnerJoin(IQuery q, Expression> on) { AntUtils.CheckNull(q); AntUtils.CheckNull(on); return new JoiningQuery(this, (Queryable)q, JoinType.InnerJoin, on); } /// /// 左关联 /// /// /// /// /// public IJoiningQuery LeftJoin(IQuery q, Expression> on) { AntUtils.CheckNull(q); AntUtils.CheckNull(on); return new JoiningQuery(this, (Queryable)q, JoinType.LeftJoin, on); } /// /// 右关联 /// /// /// /// /// public IJoiningQuery RightJoin(IQuery q, Expression> on) { AntUtils.CheckNull(q); AntUtils.CheckNull(on); return new JoiningQuery(this, (Queryable)q, JoinType.RightJoin, on); } /// /// 全连接 /// /// /// /// /// public IJoiningQuery FullJoin(IQuery q, Expression> on) { AntUtils.CheckNull(q); AntUtils.CheckNull(on); return new JoiningQuery(this, (Queryable)q, JoinType.FullJoin, on); } public IJoiningQuery InnerJoin(Expression> on) { return this.Join(new Queryable(this._dbContext), JoinType.InnerJoin, on); } public IJoiningQuery Join(IQuery q, JoinType joinType, Expression> on) { AntUtils.CheckNull(q); AntUtils.CheckNull(on); return new JoiningQuery(this, (Queryable)q, joinType, on); } public IJoiningQuery LeftJoin(Expression> on) { return this.LeftJoin(new Queryable(this._dbContext), on); } public IJoiningQuery RightJoin(Expression> on) { return this.RightJoin(new Queryable(this._dbContext), on); } public IJoiningQuery FullJoin(Expression> on) { return this.FullJoin(new Queryable(this._dbContext), on); } #region 最终调用的方法 /// /// /// /// public ResponseModel First() { ResponseModel reslut = new ResponseModel(); var q = (Queryable)this.Top(1); if (q.db.IsNull() || q.db.IsUnEnable) q.db = DbContext.db; if (q.db.IsNull() || q.db.IsUnEnable) { reslut.IsSuccess = false; reslut.Message = "连接数据库配置不能为空"; return reslut; } DbContext.DbContextServiceProvider = DbContext.CreateDataAccess(q.db); //IEnumerable iterator = q.GenerateIterator();//原始写法 InternalQuery iterator = q.GenerateIterator(); var mod = iterator.First(); sw.Stop(); if (mod != null) { reslut.IsSuccess = true; reslut.ResultModel = mod; reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds; } else { reslut.Message = "数据库中没有您要查询的数据"; } reslut.StrSql = iterator.ToString(); reslut.DBConfig = iterator.GetDataConnection(); return reslut; } /// /// 返回序列中的第一个元素,如果数据库查不到数据就会报错(注:用此方法就要保证数据能查到数据) /// /// public ResponseModel First(RequestModel request) { ResponseModel reslut = new ResponseModel(); var q = (Queryable)this.Top(1); if (q.db.IsNull() || q.db.IsUnEnable) q.db = request.db; if (q.db.IsNull() || q.db.IsUnEnable) q.db = _dbContext.db; if (q.db.IsNull() || q.db.IsUnEnable) { reslut.IsSuccess = false; reslut.Message = "连接数据库配置不能为空"; return reslut; } DbContext.DbContextServiceProvider = DbContext.CreateDataAccess(q.db); //IEnumerable iterator = q.GenerateIterator();//原始写法 InternalQuery iterator = q.GenerateIterator(); var mod = iterator.First(); sw.Stop(); if (mod != null) { reslut.IsSuccess = true; reslut.ResultModel = mod; reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds; } else { reslut.Message = "数据库中没有您要查询的数据"; } reslut.StrSql = iterator.ToString(); reslut.DBConfig = iterator.GetDataConnection(); return reslut; } /// /// 返回序列中的第一个元素 /// /// /// public ResponseModel First(Expression> predicate) { ResponseModel reslut = new ResponseModel(); if (this.DbContext.db.IsNull() || this.DbContext.db.IsUnEnable) { reslut.IsSuccess = false; reslut.Message = "连接数据库配置不能为空"; return reslut; } var mod = this.Where(predicate).First(); if (mod != null) { reslut.IsSuccess = true; reslut.ResultModel = mod; DbContext.TrackEntity(mod);//这时只会更新被修改的字段 reslut.Message = "数据返回成功"; } else { reslut.Message = "数据库中没有您要查询的数据"; } reslut.StrSql = this.ToString(); reslut.DBConfig = this.GetDataConnection(); return reslut; } /// /// 获取一条数据 /// /// public ResponseModel FirstOrDefault() { ResponseModel reslut = new ResponseModel(); var q = (Queryable)this.Top(1); if (q.db.IsNull() || q.db.IsUnEnable) { q.db = DbContext.db; } if (q.db.IsNull() || q.db.IsUnEnable) { reslut.IsSuccess = false; reslut.Message = "连接数据库配置不能为空"; return reslut; } _dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(q.db); //IEnumerable iterator = q.GenerateIterator();//原始写法 InternalQuery iterator = q.GenerateIterator(); var mod = iterator.FirstOrDefault(); sw.Stop(); if (mod != null) { reslut.IsSuccess = true; DbContext.TrackEntity(mod);//这时只会更新被修改的字段 reslut.ResultModel = mod; reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds; } else { reslut.Message = "数据库中没有您要查询的数据"; } reslut.StrSql = iterator.ToString(); reslut.DBConfig = iterator.GetDataConnection(); return reslut; } /// /// 获取一条数据 /// /// public ResponseModel FirstOrDefault(RequestModel request) { ResponseModel reslut = new ResponseModel(); try { var q = (Queryable)this.Top(1); //IEnumerable iterator = q.GenerateIterator();//原始写法 if (q.db.IsNull() || q.db.IsUnEnable) q.db = DbContext.db; if (q.db.IsNull() || q.db.IsUnEnable) q.db = request.db; if (q.db.IsNull() || q.db.IsUnEnable) { reslut.IsSuccess = false; reslut.Message = "连接数据库配置不能为空"; return reslut; } _dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(q.db); InternalQuery iterator = q.GenerateIterator(); reslut.StrSql = iterator.ToString(); reslut.DBConfig = iterator.GetDataConnection(); var mod = iterator.FirstOrDefault(); sw.Stop(); if (mod != null) { reslut.IsSuccess = true; if (request.Tracking) { DbContext.TrackEntity(mod);//这时只会更新被修改的字段 } reslut.ResultModel = mod; reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds; } else { reslut.Message = "数据库中没有您要查询的数据"; } } catch (Exception ex) { reslut.IsSuccess = false; reslut.Message = ex.ToString(); } return reslut; } /// /// 获取一条数据 /// /// /// /// public ResponseModel FirstOrDefault(Expression> predicate, RequestModel request) { ResponseModel reslut = new ResponseModel(); var q = (Queryable)this.Top(1); if (q.db.IsNull() || q.db.IsUnEnable) q.db = DbContext.db; if (q.db.IsNull() || q.db.IsUnEnable) q.db = request.db; if (q.db.IsNull() || q.db.IsUnEnable) { reslut.IsSuccess = false; reslut.Message = "连接数据库配置不能为空"; return reslut; } var mod = q.Where(predicate).FirstOrDefault(); if (request.Tracking) { DbContext.TrackEntity(mod);//这时只会更新被修改的字段 } reslut.ResultModel = mod; sw.Stop(); if (mod != null) { reslut.IsSuccess = true; reslut.ResultModel = mod; reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds; } else { reslut.Message = "数据库中没有您要查询的数据"; } reslut.StrSql = this.ToString(); reslut.DBConfig = this.GetDataConnection(); return reslut; } /// /// 获取列表 /// /// public ResponseModel ToList() { ResponseModel reslut = new ResponseModel(); if (db.IsNull() || db.IsUnEnable) { db = DbContext.db; } if (db.IsNull() || db.IsUnEnable) { reslut.IsSuccess = false; reslut.Message = "连接数据库配置不能为空"; return reslut; } this._dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(db); //IEnumerable iterator = this.GenerateIterator();//原始写法 InternalQuery iterator = this.GenerateIterator(); reslut.StrSql = iterator.ToString(); reslut.DBConfig = iterator.GetDataConnection(); var modlist = iterator.ToList(); if (modlist != null) { if (modlist.Count > 0) { reslut.ResultModel = modlist; reslut.RecordNum = modlist.Count; reslut.IsSuccess = true; sw.Stop(); reslut.Message = string.Format("查询成功记录条数:{0}耗时:{1}", modlist.Count(), sw.ElapsedMilliseconds); } else { reslut.Message = "数据库中没有您要查询的数据"; } } else { reslut.Message = "数据库中没有您要查询的数据"; } return reslut; } /// /// /// /// /// public ResponseModel ToList(RequestModel request) { ResponseModel reslut = new ResponseModel(); try { if (db.IsNull() || db.IsUnEnable) db = DbContext.db; if (db.IsNull() || db.IsUnEnable) db = request.db; this._dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(db); InternalQuery iterator = this.GenerateIterator(); if (db.IsNull() || db.IsUnEnable) { reslut.IsSuccess = false; reslut.Message = "连接数据库配置不能为空"; return reslut; } var modlist = iterator.ToList(); reslut.ResultModel = modlist; reslut.RecordNum = modlist.Count; sw.Stop(); if (modlist != null) { if (modlist.Count > 0) { reslut.IsSuccess = true; reslut.Message = string.Format("查询成功记录条数:{0}耗时:{1}", modlist.Count(), sw.ElapsedMilliseconds); } else { reslut.Message = "数据库中没有您要查询的数据"; } } else { reslut.Message = "数据库中没有您要查询的数据"; } reslut.StrSql = iterator.ToString(); reslut.DBConfig = iterator.GetDataConnection(); } catch(Exception ex) { } return reslut; } #endregion /// /// 是否存在这条记录 /// /// public ResponseModel Any() { ResponseModel reslut = new ResponseModel(); var q = (Queryable)this.Select(a => "1").Top(1); if (q.db.IsNull() || q.db.IsUnEnable) q.db = DbContext.db; reslut.IsSuccess = q.GenerateIterator().Any(); return reslut; } /// /// 确定序列中是否有元素满足条件 /// /// /// public ResponseModel Any(Expression> predicate) { ResponseModel reslut = new ResponseModel(); var q = this.Where(predicate); reslut.IsSuccess = q.Any().IsSuccess; return reslut; } /// /// 查询记录数 /// /// public int Count() { var getmethod = GetCalledMethod(() => default(IQuery).Count()); var reslut = this.ExecuteAggregateQuery(getmethod, null, null, false).Item1; return reslut; } public ResponseModel Count(RequestModel request) { var num = this.ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Count()), null, request, false).Item2; return num; } /// /// /// /// public ResponseModel LongCount() { return this.ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).LongCount()), null, null, false).Item2; } /// /// 最大记录 /// /// /// /// public TResult Max(Expression> selector) { return ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Max(default(Expression>))), selector).Item1; } /// /// 最小记录 /// /// /// /// public TResult Min(Expression> selector) { return ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Min(default(Expression>))), selector).Item1; } #region Sum /// /// /// /// /// public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = this.ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = this.ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Sum(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } #endregion #region Average public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } public Tuple Average(Expression> selector, RequestModel request = null) { var reslut = ExecuteAggregateQuery(GetCalledMethod(() => default(IQuery).Sum(default(Expression>), request)), selector, request); return reslut; } #endregion public override QueryExpression QueryExpression { get { return this._expression; } } public override bool TrackEntity { get { return this._trackEntity; } } public IQuery AsTracking() { return new Queryable(this._dbContext, this.QueryExpression, true); } public IEnumerable AsEnumerable() { return this.GenerateIterator(); } /// /// /// /// InternalQuery GenerateIterator() { InternalQuery internalQuery = new InternalQuery(this); return internalQuery; } /// /// /// /// /// /// /// /// /// Tuple ExecuteAggregateQuery(MethodInfo method, Expression parameter, RequestModel request = null, bool checkParameter = true) { ResponseModel reslut = new ResponseModel(); if (checkParameter) AntUtils.CheckNull(parameter); if (db.IsNull() || db.IsUnEnable) db = DbContext.db; if (db.IsNull() || db.IsUnEnable) db = request.db; this._dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(db); List parameters = parameter == null ? EmptyParameterList : new List(1) { parameter }; AggregateQueryExpression e = new AggregateQueryExpression(this._expression, method, parameters); var q = new Queryable(this._dbContext, e, false); if (q.db.IsNull() || q.db.IsUnEnable) { q.db = db; } if (q.db.IsNull() || q.db.IsUnEnable) { reslut.IsSuccess = false; reslut.Message = "连接数据库配置不能为空"; TResult obj = Activator.CreateInstance(); Tuple resluterro = new Tuple(obj, reslut); return resluterro; } IEnumerable iterator = this.CreateAggregateQuery(q); reslut.IsSuccess = true; reslut.ResultModel = iterator.Single(); Tuple resluts = new Tuple(iterator.Single(), reslut); return resluts; } /// /// /// /// /// /// InternalQuery CreateAggregateQuery(Queryable q) { InternalQuery iterator = q.GenerateIterator(); return iterator; } /// /// /// /// /// /// MethodInfo GetCalledMethod(Expression> exp) { var body = (MethodCallExpression)exp.Body; return body.Method; } /// /// 获取SQL语句 /// /// public override string ToString() { InternalQuery internalQuery = this.GenerateIterator(); return internalQuery.ToString(); } /// /// 获取数据库连接 /// /// public string GetDataConnection() { InternalQuery internalQuery = this.GenerateIterator(); return internalQuery.GetDataConnection(); } } }