コード例 #1
0
ファイル: Sql2005.cs プロジェクト: zlzforever/AutoCSer
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
            }
        }
コード例 #4
0
        /// <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);
            }
        }
コード例 #5
0
ファイル: Client.cs プロジェクト: zhangzheng1205/AutoCSer
        /// <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);
            }
        }
コード例 #6
0
ファイル: Cache.cs プロジェクト: zhangzheng1205/AutoCSer
 /// <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();
     }
 }
コード例 #7
0
        /// <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);
            }
        }
コード例 #8
0
        /// <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);
            }
        }
コード例 #9
0
ファイル: Client.cs プロジェクト: AutoCSer/AutoCSer
        /// <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);
            }
        }
コード例 #10
0
ファイル: Sql2005.cs プロジェクト: AutoCSer/AutoCSer
        /// <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);
            }
        }
コード例 #11
0
        /// <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(')');
        }