/// <summary>
        /// 移动排序。
        /// </summary>
        /// <param name="entityType">模型实例。</param>
        /// <param name="direction">方向:"&lt;"下移,"&gt;"上移。</param>
        /// <param name="order">排序列。</param>
        /// <param name="expression">分组条件表达式。</param>
        /// <returns>返回SQL构建实例。</returns>
        public override SqlIndentedStringBuilder Move(IEntityType entityType, string direction, LambdaExpression order,
                                                      Expression expression)
        {
            var column     = SqlHelper.DelimitIdentifier(order.GetPropertyAccess().Name);
            var table      = SqlHelper.DelimitIdentifier(entityType.Table);
            var primaryKey = SqlHelper.DelimitIdentifier(entityType.SingleKey().Name);

            var where = Visit(expression);
            var builder = new SqlIndentedStringBuilder();

            builder.AppendLine("DECLARE @CurrentOrder int;");
            builder.AppendLine($"SELECT @CurrentOrder = ISNULL({column}, 0) FROM {table} WHERE {primaryKey} = {PrimaryKeyParameter};");
            builder.AppendLine("DECLARE @AffectId int;");
            builder.AppendLine("DECLARE @AffectOrder int;");
            builder.Append($"SELECT TOP(1) @AffectId = {primaryKey}, @AffectOrder = ISNULL({column}, 0) FROM {table} {WithNolock()} WHERE {column} {direction} @CurrentOrder")
            .AppendEx(where, " AND {0}").Append($" ORDER BY {column}").AppendLine(direction == "<" ? " DESC;" : ";");
            builder.AppendLine($@"IF @AffectId IS NOT NULL AND @AffectId > 0 BEGIN
	BEGIN TRANSACTION;
	UPDATE {table} SET {column} = @AffectOrder WHERE {primaryKey} = {PrimaryKeyParameter};
	IF(@@ERROR<>0) BEGIN
		ROLLBACK TRANSACTION;
		SELECT 0;
	END
	UPDATE {table} SET {column} = @CurrentOrder WHERE {primaryKey} = @AffectId;
	IF(@@ERROR<>0) BEGIN
		ROLLBACK TRANSACTION;
		SELECT 0;
	END
	COMMIT TRANSACTION;
	SELECT 1;
END");
            return(builder);
        }
        /// <summary>
        /// 分页查询脚本。
        /// </summary>
        /// <param name="sql">当前查询实例。</param>
        /// <param name="builder"><see cref="SqlIndentedStringBuilder"/>实例。</param>
        protected override void PageQuery(IQuerySql sql, SqlIndentedStringBuilder builder)
        {
            builder.Append("SELECT ");
            if (sql.IsDistinct)
            {
                builder.Append("DISTINCT ");
            }
            builder.Append(sql.FieldSql).Append(" ");
            builder.Append(sql.FromSql).Append(" ");
            builder.Append(sql.WhereSql).Append(" ");
            builder.Append(sql.OrderBySql).Append(" ");

            var size = sql.Size ?? 20;

            builder.Append("OFFSET ")
            .Append(Math.Max((sql.PageIndex.Value - 1) * size, 0))
            .Append(" ROWS FETCH NEXT ")
            .Append(size)
            .AppendLine(" ROWS ONLY;");

            builder.Append("SELECT COUNT(");
            if (sql.IsDistinct && sql.Aggregation != "1")
            {
                builder.Append("DISTINCT ");
            }
            builder.Append(sql.Aggregation);
            builder.Append(")");
            builder.Append(sql.FromSql).Append(" ");
            builder.Append(sql.WhereSql).Append(";");
        }
        /// <summary>
        /// 判断是否存在。
        /// </summary>
        /// <param name="entityType">模型实例。</param>
        /// <param name="expression">条件表达式。</param>
        /// <returns>返回SQL构建实例。</returns>
        public override SqlIndentedStringBuilder Any(IEntityType entityType, Expression expression)
        {
            var builder = new SqlIndentedStringBuilder();

            builder.Append("SELECT TOP(1) 1 FROM ").Append(SqlHelper.DelimitIdentifier(entityType.Table))
            .Append(" ")
            .Append(WithNolock())
            .Append(" ");
            builder.AppendEx(Visit(expression), " WHERE {0}").Append(SqlHelper.StatementTerminator);
            return(builder);
        }
        /// <summary>
        /// 判断唯一主键关联是否存在。
        /// </summary>
        /// <param name="entityType">模型实例。</param>
        /// <returns>返回SQL构建实例。</returns>
        public override SqlIndentedStringBuilder Any(IEntityType entityType)
        {
            var builder = new SqlIndentedStringBuilder();

            builder.Append("SELECT TOP(1) 1 FROM ").Append(SqlHelper.DelimitIdentifier(entityType.Table))
            .Append(" ")
            .Append(WithNolock())
            .Append(" ");
            AppendWherePrimaryKey(builder, entityType);
            return(builder);
        }
 /// <summary>
 /// 查询脚本。
 /// </summary>
 /// <param name="sql">当前查询实例。</param>
 /// <param name="builder"><see cref="IndentedStringBuilder"/>实例。</param>
 protected override void Query(IQuerySql sql, SqlIndentedStringBuilder builder)
 {
     builder.Append("SELECT ");
     if (sql.IsDistinct)
     {
         builder.Append("DISTINCT ");
     }
     builder.Append(sql.FieldSql).Append(" ");
     builder.Append(sql.FromSql).Append(" ");
     builder.Append(sql.WhereSql).Append(" ");
     builder.Append(sql.OrderBySql).Append(SqlHelper.StatementTerminator);
 }