/// <summary> /// 查询对象集合 /// </summary> /// <typeparam name="valueType">对象类型</typeparam> /// <typeparam name="modelType">模型类型</typeparam> /// <param name="sqlTool">SQL操作工具</param> /// <param name="createQuery"></param> /// <param name="query">查询信息</param> /// <param name="sqlStream"></param> private unsafe void selectRows <valueType, modelType> (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query, CharStream sqlStream) where valueType : class, modelType where modelType : class { sqlStream.WriteNotNull("select * from(select "); DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap); sqlStream.WriteNotNull(",row_number()over("); createQuery.WriteOrder(sqlTool, sqlStream, ref query); string fieldName, fieldSqlName; query.GetIndex(out fieldName, out fieldSqlName); sqlStream.SimpleWriteNotNull(")as "); sqlStream.SimpleWriteNotNull(orderOverName); sqlStream.SimpleWriteNotNull(" from["); sqlStream.SimpleWriteNotNull(sqlTool.TableName); sqlStream.SimpleWriteNotNull("]with(nolock)"); sqlTool.Client.GetSql(createQuery.Where, sqlStream, ref query); if (query.IndexFieldName == null) { query.SetIndex(fieldName, fieldSqlName); } sqlStream.SimpleWriteNotNull(")as T where "); sqlStream.SimpleWriteNotNull(orderOverName); sqlStream.SimpleWriteNotNull(" between "); AutoCSer.Extension.Number.ToString(query.SkipCount, sqlStream); sqlStream.SimpleWriteNotNull(" and "); AutoCSer.Extension.Number.ToString(query.SkipCount + createQuery.GetCount - 1, sqlStream); }
/// <summary> /// 查询对象集合 /// </summary> /// <typeparam name="valueType">对象类型</typeparam> /// <typeparam name="modelType">模型类型</typeparam> /// <param name="sqlTool">SQL操作工具</param> /// <param name="createQuery"></param> /// <param name="query">查询信息</param> /// <param name="sqlStream"></param> private unsafe void selectNoOrder <valueType, modelType> (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query, CharStream sqlStream) where valueType : class, modelType where modelType : class { sqlStream.SimpleWriteNotNull("select "); int count = query.SkipCount + createQuery.GetCount; if (count != 0) { sqlStream.SimpleWriteNotNull("top "); AutoCSer.Extension.Number.ToString(count, sqlStream); sqlStream.Write(' '); } if (query.MemberMap != null) { DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap); } else { sqlStream.Write('*'); } sqlStream.SimpleWriteNotNull(" from ["); sqlStream.SimpleWriteNotNull(sqlTool.TableName); sqlStream.SimpleWriteNotNull("]with(nolock)"); createQuery.WriteWhere(sqlTool, sqlStream, ref query); createQuery.WriteOrder(sqlTool, sqlStream, ref query); }
/// <summary> /// 自增ID整表数组缓存 /// </summary> /// <param name="sqlTool">SQL操作工具</param> /// <param name="memberCache"></param> /// <param name="isValue">数据匹配器,必须保证更新数据的匹配一致性</param> /// <param name="baseIdentity">基础ID</param> /// <param name="group">数据分组</param> public IdentityArrayWhereExpression(Sql.Table <valueType, modelType> sqlTool, Expression <Func <valueType, memberCacheType> > memberCache , Expression <Func <modelType, bool> > isValue, int group = 0, int baseIdentity = 0) : base(sqlTool, memberCache, group, baseIdentity, false) { if (isValue == null) { throw new ArgumentNullException(); } CreateSelectQuery <modelType> createQuery = new CreateSelectQuery <modelType>(isValue); if (createQuery.Where.Type == WhereExpression.ConvertType.Unknown) { throw new InvalidCastException(); } this.isValue = isValue.Compile(); sqlTool.OnInserted += onInserted; sqlTool.OnUpdated += onUpdated; sqlTool.OnDeleted += onDeleted; if (!createQuery.Where.IsWhereFalse) { reset(createQuery.Where.NullExpression); } }
/// <summary> /// 查询对象集合 /// </summary> /// <typeparam name="valueType">对象类型</typeparam> /// <typeparam name="modelType">模型类型</typeparam> /// <param name="sqlTool">SQL操作工具</param> /// <param name="createQuery"></param> /// <param name="query">查询信息</param> /// <param name="keyName">关键之名称</param> /// <param name="sqlStream"></param> private unsafe void selectKeys <valueType, modelType> (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query, string keyName, CharStream sqlStream) where valueType : class, modelType where modelType : class { sqlStream.SimpleWriteNotNull("select "); if (query.MemberMap != null) { DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap, constantConverter); } else { sqlStream.Write('*'); } sqlStream.SimpleWriteNotNull(" from["); sqlStream.SimpleWriteNotNull(sqlTool.TableName); sqlStream.WriteNotNull("]with(nolock)where "); sqlStream.SimpleWriteNotNull(keyName); sqlStream.SimpleWriteNotNull(" in(select "); sqlStream.SimpleWriteNotNull(keyName); sqlStream.SimpleWriteNotNull(" from(select "); sqlStream.SimpleWriteNotNull(keyName); sqlStream.WriteNotNull(",row_number()over("); int startIndex = sqlStream.Length; createQuery.WriteOrder(sqlTool, sqlStream, constantConverter, ref query); string fieldName, fieldSqlName; query.GetIndex(out fieldName, out fieldSqlName); int count = sqlStream.Length - startIndex; sqlStream.SimpleWriteNotNull(")as "); sqlStream.SimpleWriteNotNull(orderOverName); sqlStream.SimpleWriteNotNull(" from["); sqlStream.SimpleWriteNotNull(sqlTool.TableName); sqlStream.SimpleWriteNotNull("]with(nolock)"); sqlTool.Client.GetSql(createQuery.Where, sqlStream, ref query); if (query.IndexFieldName == null) { query.SetIndex(fieldName, fieldSqlName); } sqlStream.SimpleWriteNotNull(")as T where "); sqlStream.SimpleWriteNotNull(orderOverName); sqlStream.SimpleWriteNotNull(" between "); AutoCSer.Extension.Number.ToString(query.SkipCount, sqlStream); sqlStream.SimpleWriteNotNull(" and "); AutoCSer.Extension.Number.ToString(query.SkipCount + createQuery.GetCount - 1, sqlStream); sqlStream.Write(')'); if (count != 0) { sqlStream.Write(sqlStream.Char + startIndex, count); } }
/// <summary> /// 获取查询信息 /// </summary> /// <typeparam name="valueType">对象类型</typeparam> /// <typeparam name="modelType">模型类型</typeparam> /// <param name="sqlTool">SQL操作工具</param> /// <param name="createQuery"></param> /// <param name="query">查询信息</param> /// <returns>对象集合</returns> internal override void GetSelectQuery <valueType, modelType> (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query) { CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null); if (sqlStream == null) { sqlStream = new CharStream(null, 0); } byte *buffer = null; try { sqlStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize); if ((createQuery.GetCount | query.SkipCount) != 0) { sqlStream.WriteNotNull("select * from("); } sqlStream.WriteNotNull("select "); if (query.MemberMap != null) { DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap, constantConverter); } else { sqlStream.Write('*'); } sqlStream.WriteNotNull(" from "); sqlStream.WriteNotNull(sqlTool.TableName); sqlStream.Write(' '); createQuery.WriteWhere(sqlTool, sqlStream, ref query); createQuery.WriteOrder(sqlTool, sqlStream, constantConverter, ref query); if ((createQuery.GetCount | query.SkipCount) != 0) { sqlStream.WriteNotNull(")where rownum between "); AutoCSer.Extension.Number.ToString(query.SkipCount, sqlStream); sqlStream.WriteNotNull(" and "); AutoCSer.Extension.Number.ToString(createQuery.GetCount, sqlStream); sqlStream.WriteNotNull(" order by rownum asc"); } query.Sql = sqlStream.ToString(); } finally { if (buffer != null) { AutoCSer.UnmanagedPool.Default.Push(buffer); } sqlStream.Dispose(); Interlocked.Exchange(ref this.sqlStream, sqlStream); } }
/// <summary> /// 重置缓存 /// </summary> /// <param name="cache"></param> /// <param name="where"></param> internal ResetTask(Cache<valueType, modelType> cache, Expression<Func<modelType, bool>> where) { byte isQuery = 0; try { CreateSelectQuery<modelType> createQuery = new CreateSelectQuery<modelType>(where); (this.cache = cache).SqlTable.GetSelect(cache.MemberMap, ref createQuery, ref Query); isQuery = 1; wait.Set(0); } finally { if (isQuery == 0) Query.Free(); } }
/// <summary> /// 获取查询信息 /// </summary> /// <typeparam name="valueType">对象类型</typeparam> /// <typeparam name="modelType">模型类型</typeparam> /// <param name="sqlTool">SQL操作工具</param> /// <param name="createQuery"></param> /// <param name="query">查询信息</param> /// <returns>对象集合</returns> internal override void GetSelectQuery <valueType, modelType> (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query) { CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null); if (sqlStream == null) { sqlStream = new CharStream(null, 0); } byte *buffer = null; try { sqlStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize); sqlStream.SimpleWriteNotNull("select "); int count = query.SkipCount + createQuery.GetCount; if (count != 0) { sqlStream.SimpleWriteNotNull("top "); AutoCSer.Extension.Number.ToString(count, sqlStream); sqlStream.Write(' '); } if (query.MemberMap != null) { DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap); } else { sqlStream.Write('*'); } sqlStream.SimpleWriteNotNull(" from ["); sqlStream.SimpleWriteNotNull(sqlTool.TableName); sqlStream.Write(']'); createQuery.WriteWhere(sqlTool, sqlStream, ref query); createQuery.WriteOrder(sqlTool, sqlStream, ref query); query.Sql = sqlStream.ToString(); } finally { if (buffer != null) { AutoCSer.UnmanagedPool.Default.Push(buffer); } sqlStream.Dispose(); Interlocked.Exchange(ref this.sqlStream, sqlStream); } }
/// <summary> /// 获取查询信息 /// </summary> /// <typeparam name="valueType">对象类型</typeparam> /// <typeparam name="modelType">模型类型</typeparam> /// <param name="sqlTool">SQL操作工具</param> /// <param name="createQuery"></param> /// <param name="query">查询信息</param> /// <returns>对象集合</returns> internal override void GetSelectQuery <valueType, modelType> (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query) { CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null); if (sqlStream == null) { sqlStream = new CharStream(null, 0); } byte *buffer = null; try { sqlStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize); if (query.SkipCount != 0 && createQuery.IsOrder) { if (DataModel.Model <modelType> .PrimaryKeys.Length == 1) { selectKeys(sqlTool, ref createQuery, ref query, DataModel.Model <modelType> .PrimaryKeys[0].SqlFieldName, sqlStream); } else if (DataModel.Model <modelType> .Identity != null) { selectKeys(sqlTool, ref createQuery, ref query, DataModel.Model <modelType> .IdentitySqlName, sqlStream); } else { selectRows(sqlTool, ref createQuery, ref query, sqlStream); } } else { selectNoOrder(sqlTool, ref createQuery, ref query, sqlStream); } query.Sql = sqlStream.ToString(); } finally { if (buffer != null) { AutoCSer.UnmanagedPool.Default.Push(buffer); } sqlStream.Dispose(); Interlocked.Exchange(ref this.sqlStream, sqlStream); } }
/// <summary> /// 获取查询信息 /// </summary> /// <typeparam name="valueType">对象类型</typeparam> /// <typeparam name="modelType">模型类型</typeparam> /// <param name="sqlTool">SQL操作工具</param> /// <param name="createQuery"></param> /// <param name="query">查询信息</param> /// <returns>对象集合</returns> internal override void GetSelectQuery <valueType, modelType> (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query) { CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null); if (sqlStream == null) { sqlStream = new CharStream(default(AutoCSer.Memory.Pointer)); } AutoCSer.Memory.Pointer buffer = default(AutoCSer.Memory.Pointer); try { buffer = UnmanagedPool.Default.GetPointer(); sqlStream.Reset(ref buffer); sqlStream.SimpleWrite("select "); int count = query.SkipCount + createQuery.GetCount; if (count != 0) { sqlStream.SimpleWrite("top "); AutoCSer.Extensions.NumberExtension.ToString(count, sqlStream); sqlStream.Write(' '); } if (query.MemberMap != null) { AutoCSer.Sql.DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap, constantConverter); } else { sqlStream.Write('*'); } sqlStream.SimpleWrite(" from ["); sqlStream.SimpleWrite(sqlTool.TableName); sqlStream.Write(']'); createQuery.WriteWhere(sqlTool, sqlStream, ref query); createQuery.WriteOrder(sqlTool, sqlStream, constantConverter, ref query); query.Sql = sqlStream.ToString(); } finally { UnmanagedPool.Default.Push(ref buffer); sqlStream.Dispose(); Interlocked.Exchange(ref this.sqlStream, sqlStream); } }
/// <summary> /// 获取查询信息 /// </summary> /// <typeparam name="valueType">对象类型</typeparam> /// <typeparam name="modelType">模型类型</typeparam> /// <param name="sqlTool">SQL操作工具</param> /// <param name="createQuery"></param> /// <param name="query">查询信息</param> /// <returns>对象集合</returns> internal override void GetSelectQuery <valueType, modelType> (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query) { CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null); if (sqlStream == null) { sqlStream = new CharStream(default(AutoCSer.Memory.Pointer)); } AutoCSer.Memory.Pointer buffer = default(AutoCSer.Memory.Pointer); try { buffer = UnmanagedPool.Default.GetPointer(); sqlStream.Reset(ref buffer); if (query.SkipCount != 0 && createQuery.IsOrder) { if (DataModel.Model <modelType> .PrimaryKeys.Length == 1) { selectKeys(sqlTool, ref createQuery, ref query, constantConverter.ConvertName(DataModel.Model <modelType> .PrimaryKeys[0].FieldInfo.Name), sqlStream); } else if (DataModel.Model <modelType> .Identity != null) { selectKeys(sqlTool, ref createQuery, ref query, constantConverter.ConvertName(DataModel.Model <modelType> .Identity.FieldInfo.Name), sqlStream); } else { selectRows(sqlTool, ref createQuery, ref query, sqlStream); } } else { selectNoOrder(sqlTool, ref createQuery, ref query, sqlStream); } query.Sql = sqlStream.ToString(); } finally { UnmanagedPool.Default.Push(ref buffer); sqlStream.Dispose(); Interlocked.Exchange(ref this.sqlStream, sqlStream); } }
/// <summary> /// 查询对象集合 /// </summary> /// <typeparam name="valueType">对象类型</typeparam> /// <typeparam name="modelType">模型类型</typeparam> /// <param name="sqlTool">SQL操作工具</param> /// <param name="createQuery"></param> /// <param name="query">查询信息</param> /// <param name="keyName">关键之名称</param> /// <param name="sqlStream"></param> private unsafe void selectKeys <valueType, modelType> (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query, string keyName, CharStream sqlStream) where valueType : class, modelType where modelType : class { sqlStream.SimpleWriteNotNull("select "); if (query.MemberMap != null) { DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap); } else { sqlStream.Write('*'); } sqlStream.SimpleWriteNotNull(" from "); sqlStream.SimpleWriteNotNull(sqlTool.TableName); sqlStream.WriteNotNull(" where "); sqlStream.SimpleWriteNotNull(keyName); sqlStream.WriteNotNull(" in(select top "); AutoCSer.Extension.Number.ToString(createQuery.GetCount, sqlStream); sqlStream.Write(' '); sqlStream.SimpleWriteNotNull(keyName); sqlStream.SimpleWriteNotNull(" from "); sqlStream.SimpleWriteNotNull(sqlTool.TableName); sqlStream.WriteNotNull(" where "); int whereSize, whereIndex; if (createQuery.Where == null) { whereSize = whereIndex = 0; } else { sqlStream.Write('('); whereIndex = sqlStream.Length; sqlTool.Client.GetSql(createQuery.Where, sqlStream, ref query); if ((whereSize = sqlStream.Length - whereIndex) == 0) { sqlStream.ByteSize -= sizeof(char); } else { sqlStream.Write(")and "); } } sqlStream.SimpleWriteNotNull(keyName); sqlStream.WriteNotNull(" not in(select top "); AutoCSer.Extension.Number.ToString(query.SkipCount, sqlStream); sqlStream.Write(' '); sqlStream.SimpleWriteNotNull(keyName); sqlStream.SimpleWriteNotNull(" from "); sqlStream.SimpleWriteNotNull(sqlTool.TableName); sqlStream.Write(']'); if (whereSize != 0) { sqlStream.SimpleWriteNotNull("where "); sqlStream.Write(sqlStream.Char + whereIndex, whereSize); } whereIndex = sqlStream.Length; createQuery.WriteOrder(sqlTool, sqlStream, ref query); whereSize = sqlStream.Length - whereIndex; sqlStream.Write(')'); if (whereSize != 0) { sqlStream.Write(sqlStream.Char + whereIndex, whereSize); } sqlStream.Write(')'); }