예제 #1
0
        public bool Exists <TEntity>(ICommandTunnel tunnel = null)
        {
            var command = this._engine.Provider.SqlFactory.CreateExistsCommand(TypeMapper.Instance <TEntity> .Mapper, this._where, tunnel);
            var r       = this._engine.Execute(command).ToScalar();

            return(r != null);
        }
예제 #2
0
 public override ExecuteCommand CreateLastIdentityCommand(TypeMapper mapper, ICommandTunnel tunnel = null)
 {
     if (tunnel == null)
     {
         tunnel = Empty;
     }
     return(tunnel.GetCommand(mapper, new ExecuteCommand("SELECT last_insert_rowid()")));
 }
예제 #3
0
        /// <summary>
        /// 获取最后递增序列值。
        /// </summary>
        /// <param name="engine">数据源查询与交互引擎的实例。</param>
        /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
        /// <returns>递增序列值。</returns>
        public static long GetLastIdentity <TEntity>(this IDbEngine engine, ICommandTunnel tunnel = null)
        {
            if (engine == null)
            {
                throw new ArgumentNullException(nameof(engine));
            }
            var command = engine.Provider.SqlFactory.CreateLastIdentityCommand(TypeMapper.Instance <TEntity> .Mapper, tunnel);

            return(engine.Execute(command).ToScalar <long>());
        }
예제 #4
0
        public PageData <TView> FindAll <TEntity, TView>(IPagination page, ICommandTunnel tunnel = null)
        {
            if (page == null)
            {
                throw new ArgumentNullException(nameof(page));
            }

            var command = this._engine.Provider.SqlFactory.CreateQueryCommand(TypeMapper.Instance <TEntity> .Mapper, TypeMapper.Instance <TView> .Mapper, this._where, 0, tunnel);

            return(this._engine.Execute(command).ToEntities <TView>(page));
        }
예제 #5
0
        public List <TView> FindAll <TEntity, TView>(Func <TEntity, TView> select, ICommandTunnel tunnel = null)
        {
            if (select == null)
            {
                return(this.FindAll <TEntity, TView>(tunnel));
            }
            var atObj    = new AnonymousTypeObject <TView>();
            var command  = this._engine.Provider.SqlFactory.CreateQueryCommand(TypeMapper.Instance <TEntity> .Mapper, atObj.Fields, this._where, 0, tunnel);
            var entities = this._engine.Execute(command).ToEntities();

            return((from item in entities select atObj.Create(item as DynamicEntityValue)).ToList());
        }
예제 #6
0
        /// <summary>
        /// 指定类型映射器创建一个获取最后递增序列值的命令。
        /// </summary>
        /// <param name="mapper">类型映射器。</param>
        /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
        /// <returns>查询命令。</returns>
        public virtual ExecuteCommand CreateLastIdentityCommand(TypeMapper mapper, ICommandTunnel tunnel = null)
        {
            if (mapper == null)
            {
                throw new ArgumentNullException(nameof(mapper));
            }
            if (tunnel == null)
            {
                tunnel = Empty;
            }

            return(tunnel.GetCommand(mapper, new ExecuteCommand("SELECT @@IDENTITY")));
        }
예제 #7
0
        public TView FindOne <TEntity, TView>(Func <TEntity, TView> select, ICommandTunnel tunnel = null)
        {
            if (select == null)
            {
                return(this.FindOne <TEntity, TView>(tunnel));
            }
            var atObj   = new AnonymousTypeObject <TView>();
            var command = this._engine.Provider.SqlFactory.CreateQueryCommand(TypeMapper.Instance <TEntity> .Mapper, atObj.Fields, this._where, 1, tunnel);
            var entity  = this._engine.Execute(command).ToEntity();

            if (entity == null)
            {
                return(default(TView));
            }
            return(atObj.Create(entity as DynamicEntityValue));
        }
예제 #8
0
        /// <summary>
        /// 指定类型映射器创建一个获取最后递增序列值的命令。
        /// </summary>
        /// <param name="mapper">类型映射器。</param>
        /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
        /// <returns>一个查询命令。</returns>
        public virtual ExecuteCommand CreateLastIdentityCommand(TypeMapper mapper, ICommandTunnel tunnel = null)
        {
            if(mapper == null) throw new ArgumentNullException(nameof(mapper));
            if(tunnel == null) tunnel = Empty;

            return tunnel.GetCommand(mapper, new ExecuteCommand("SELECT @@IDENTITY"));
        }
예제 #9
0
 public long RowCount <TEntity>(ICommandTunnel tunnel = null)
 => this._bus.Call(new CMD.RowCount <TEntity> {
     Where = this._where, Tunnel = tunnel
 });
예제 #10
0
 /// <summary>
 /// 获取指定 <paramref name="keyValue"/> 值的数据源对象。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <typeparam name="TView">视图的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="keyValue">主键的列值。</param>
 /// <param name="select">视图选择器。可以为 null 值,表示不采用匿名对象的方式。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>实体。</returns>
 public static TView FindOne <TEntity, TView>(this IDbEngine engine, object keyValue, Func <TEntity, TView> select, ICommandTunnel tunnel = null)
 => FindOne(engine, null, keyValue, select, tunnel);
예제 #11
0
 /// <summary>
 /// 判断指定的主键的列名的值是否已存在。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="keyValue">主键的列值。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>表示数据是否存在。</returns>
 public static bool Exists <TEntity>(this IDbEngine engine, object keyValue, ICommandTunnel tunnel = null)
 => Exists <TEntity>(engine, null, keyValue, tunnel);
예제 #12
0
 /// <summary>
 /// 执行一个更新的命令,可以是匿名对象的部分成员(<paramref name="entity"/> 属性成员和 <typeparamref name="TEntity"/> 属性成员必须一致)。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="entity">实体的实例对象,可以是匿名对象的部分成员(<paramref name="entity"/> 属性成员和 <typeparamref name="TEntity"/> 属性成员必须一致)。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>受影响的行。</returns>
 public static int ModifyAnonymous <TEntity>(this IDbEngine engine, object entity, ICommandTunnel tunnel = null)
 => Filter(engine, GetModifyKeyValues <TEntity>(entity)).Modify <TEntity>(entity, tunnel);
예제 #13
0
 /// <summary>
 /// 执行一个删除的命令,在删除命令中 <paramref name="entityOrPKValues"/> 可以是主键的值(表只有一个主键),也可以是匿名对象的部分成员(<paramref name="entityOrPKValues"/> 属性成员和 <typeparamref name="TEntity"/> 属性成员必须一致)。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="entityOrPKValues">实体的实例对象,在删除命令中 <paramref name="entityOrPKValues"/> 可以是主键的值(表只有一个主键,值允许是一个数组,表示删除多条记录),也可以是匿名对象的部分成员(<paramref name="entityOrPKValues"/> 属性成员和 <typeparamref name="TEntity"/> 属性成员必须一致)。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>受影响的行。</returns>
 public static int RemoveAnonymous <TEntity>(this IDbEngine engine, object entityOrPKValues, ICommandTunnel tunnel = null)
 => Filter(engine, GetRemoveWhere <TEntity>(engine, entityOrPKValues)).Remove <TEntity>(tunnel);
예제 #14
0
 public bool Exists <TEntity>(ICommandTunnel tunnel = null)
 => this._bus.Call(new CMD.Exists <TEntity> {
     Where = this._where, Tunnel = tunnel
 });
예제 #15
0
        /// <summary>
        /// 执行一个插入的命令,可以是匿名对象的部分成员(<paramref name="entity"/> 属性成员和 <typeparamref name="TEntity"/> 属性成员必须一致)。
        /// </summary>
        /// <typeparam name="TEntity">实体的数据类型。</typeparam>
        /// <param name="engine">数据源查询与交互引擎的实例。</param>
        /// <param name="entity">实体的实例对象,可以是匿名对象的部分成员(<paramref name="entity"/> 属性成员和 <typeparamref name="TEntity"/> 属性成员必须一致)。</param>
        /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
        /// <returns>受影响的行。</returns>
        public static int AddAnonymous <TEntity>(this IDbEngine engine, object entity, ICommandTunnel tunnel = null)
        {
            if (engine == null)
            {
                throw new ArgumentNullException(nameof(engine));
            }
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            var command = engine.Provider.SqlFactory.CreateInsertCommand(TypeMapper.Instance <TEntity> .Mapper, entity, tunnel);

            return(engine.Execute(command).ToNonQuery());
        }
예제 #16
0
        /// <summary>
        /// 指定类型映射器和条件参数创建一个表总行数的命令。
        /// </summary>
        /// <param name="mapper">类型映射器。</param>
        /// <param name="where">条件参数。</param>
        /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
        /// <returns>一个查询命令。</returns>
        public virtual ExecuteCommand CreateRowCountCommand(TypeMapper mapper, WhereParameters where, ICommandTunnel tunnel = null)
        {
            if(mapper == null) throw new ArgumentNullException(nameof(mapper));
            if(where == null) throw new ArgumentNullException(nameof(where));
            if(tunnel == null) tunnel = Empty;

            var commandText = "SELECT COUNT(*) FROM " + this.EscapeName(tunnel.GetTableName(mapper), NamePoint.Table);
            return tunnel.GetCommand(mapper, new ExecuteCommand(where.AppendTo(commandText), where.Parameters));
        }
예제 #17
0
 public override ExecuteCommand CreateLastIdentityCommand(TypeMapper mapper, ICommandTunnel tunnel = null)
 {
     if(tunnel == null) tunnel = Empty;
     return tunnel.GetCommand(mapper, new ExecuteCommand("SELECT last_insert_rowid()"));
 }
예제 #18
0
        /// <summary>
        /// 指定实体类型映射器、视图映射器和条件创建一个查询的命令。
        /// </summary>
        /// <param name="entityMapper">实体的类型映射器。</param>
        /// <param name="viewMapper">视图的类型映射器。</param>
        /// <param name="where">条件参数。</param>
        /// <param name="top">指定 TOP 数量,小于 1 则忽略作用。</param>
        /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
        /// <returns>一个查询命令。</returns>
        public virtual ExecuteCommand CreateQueryCommand(TypeMapper entityMapper, TypeMapper viewMapper, WhereParameters where, int top = 0, ICommandTunnel tunnel = null)
        {
            if(where == null) throw new ArgumentNullException(nameof(where));
            if(tunnel == null) tunnel = Empty;

            var fields = this.CreateFields(entityMapper, viewMapper);
            if(top > 0) fields = string.Concat("TOP ", top.ToString(), " ", fields);

            var commandText = string.Concat("SELECT ", fields, " FROM ", this.EscapeName(tunnel.GetTableName(entityMapper), NamePoint.Table));
            return tunnel.GetCommand(entityMapper, new ExecuteCommand(where.AppendTo(commandText), where.Parameters));
        }
예제 #19
0
        /// <summary>
        /// 指定类型映射器和实体创建一个更新的命令。
        /// </summary>
        /// <param name="mapper">类型映射器。</param>
        /// <param name="entity">实体的实例对象。</param>
        /// <param name="where">条件参数。</param>
        /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
        /// <returns>一个查询命令。</returns>
        public virtual ExecuteCommand CreateUpdateCommand(TypeMapper mapper, object entity, WhereParameters where, ICommandTunnel tunnel = null)
        {
            if(mapper == null) throw new ArgumentNullException(nameof(mapper));
            if(entity == null) throw new ArgumentNullException(nameof(entity));
            if(where == null) throw new ArgumentNullException(nameof(where));
            if(tunnel == null) tunnel = Empty;

            var setBuilder = new StringBuilder("UPDATE ")
                                .Append(this.EscapeName(tunnel.GetTableName(mapper), NamePoint.Table))
                                .Append(" SET ");
            var ps = where.Parameters ?? new ExecuteParameterCollection(mapper.Count);

            int index = 0;
            foreach(var property in FindProperties(mapper, ref entity))
            {
                if(property.IsIgnore || property.IsKey) continue;

                if(index++ > 0) setBuilder.Append(',');

                setBuilder.Append(this.EscapeName(property.Name, NamePoint.Field))
                          .Append('=');
                var value = property.GetValue(entity);
                this.AppendParameterValue(property, setBuilder, value, ps);
            }
            if(index==0) throw new NotSupportedException($"{entity.GetType().FullName} 的更新操作没有找到任何属性。");

            return tunnel.GetCommand(mapper, new ExecuteCommand(where.AppendTo(setBuilder.ToString()), ps));
        }
예제 #20
0
        /// <summary>
        /// 指定类型映射器和实体创建一个插入的命令。
        /// </summary>
        /// <param name="mapper">类型映射器。</param>
        /// <param name="entity">实体的实例对象。</param>
        /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
        /// <returns>一个查询命令。</returns>
        public virtual ExecuteCommand CreateInsertCommand(TypeMapper mapper, object entity, ICommandTunnel tunnel = null)
        {
            if(mapper == null) throw new ArgumentNullException(nameof(mapper));
            if(entity == null) throw new ArgumentNullException(nameof(entity));
            if(tunnel == null) tunnel = Empty;

            if(mapper.Count == 0) throw new NotSupportedException($"{entity.GetType().FullName} 的插入操作没有找到任何属性。");

            var fieldsBuilder = new StringBuilder("INSERT INTO ")
                                .Append(this.EscapeName(tunnel.GetTableName(mapper), NamePoint.Table))
                                .Append('(');
            var valueBuilder = new StringBuilder(")VALUES(");
            var ps = new ExecuteParameterCollection(mapper.Count);
            int index = 0;
            foreach(var property in FindProperties(mapper, ref entity))
            {
                if(property.IsIgnore) continue;
                var value = property.GetValue(entity);
                if(property.IsKey && object.Equals(value, property.TypeDefaultValue)) continue;

                if(index++ > 0)
                {
                    fieldsBuilder.Append(',');
                    valueBuilder.Append(',');
                }
                fieldsBuilder.Append(this.EscapeName(property.Name, NamePoint.Field));
                this.AppendParameterValue(property, valueBuilder, value, ps);
            }
            return tunnel.GetCommand(mapper, new ExecuteCommand(fieldsBuilder.Append(valueBuilder.Append(')').ToString()).ToString(), ps));
        }
예제 #21
0
 public List <TView> FindAll <TEntity, TView>(Func <TEntity, TView> select, ICommandTunnel tunnel = null)
 => this._bus.Call(new CMD.FindAll <TEntity, TView> {
     Where = this._where, Select = select, Tunnel = tunnel
 });
예제 #22
0
 public List <TEntity> FindAll <TEntity>(ICommandTunnel tunnel = null)
 => this.FindAll <TEntity, TEntity>(tunnel);
예제 #23
0
 public PageData <TView> FindAll <TEntity, TView>(Func <TEntity, TView> select, IPagination page, ICommandTunnel tunnel = null)
 => this._bus.Call(new CMD.FindAllPage <TEntity, TView> {
     Where = this._where, Select = select, Page = page, Tunnel = tunnel
 });
예제 #24
0
 public PageData <TEntity> FindAll <TEntity>(IPagination page, ICommandTunnel tunnel = null)
 => this.FindAll <TEntity, TEntity>(page, tunnel);
예제 #25
0
 /// <summary>
 /// 执行一个更新的命令。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="entity">实体的实例对象。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>受影响的行。</returns>
 public static int Modify <TEntity>(this IDbEngine engine, TEntity entity, ICommandTunnel tunnel = null)
 => ModifyAnonymous <TEntity>(engine, entity, tunnel);
예제 #26
0
 public TEntity FindOne <TEntity>(ICommandTunnel tunnel = null)
 => this.FindOne <TEntity, TEntity>(tunnel);
예제 #27
0
 /// <summary>
 /// 执行一个删除的命令。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="entity">实体的实例对象。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>受影响的行。</returns>
 public static int Remove <TEntity>(this IDbEngine engine, TEntity entity, ICommandTunnel tunnel = null)
 => RemoveAnonymous <TEntity>(engine, entity, tunnel);
예제 #28
0
 /// <summary>
 /// 获取数据表的总行数。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>数据的行数。</returns>
 public static long RowCount <TEntity>(this IDbEngine engine, ICommandTunnel tunnel = null)
 => Filter(engine).RowCount <TEntity>(tunnel);
예제 #29
0
 /// <summary>
 /// 获取指定 <paramref name="keyName"/> 键值的数据源对象。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="keyName">主键的列名。可以为 null 值。</param>
 /// <param name="keyValue">主键的列值。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>实体。</returns>
 public static TEntity FindOne <TEntity>(this IDbEngine engine, string keyName, object keyValue, ICommandTunnel tunnel = null)
 => FindOne <TEntity, TEntity>(engine, keyName, keyValue, tunnel);
예제 #30
0
        public Task <List <TView> > FindAllAsync <TEntity, TView>(ICommandTunnel tunnel = null)
        {
            var command = this._engine.Provider.SqlFactory.CreateQueryCommand(TypeMapper.Instance <TEntity> .Mapper, TypeMapper.Instance <TView> .Mapper, this._where, 0, tunnel);

            return(this._engine.Execute(command).ToEntitiesAsync <TView>());
        }
예제 #31
0
 /// <summary>
 /// 获取指定 <paramref name="keyName"/> 键值的数据源对象。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <typeparam name="TView">视图的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="keyName">主键的列名。可以为 null 值。</param>
 /// <param name="keyValue">主键的列值。</param>
 /// <param name="select">视图选择器。可以为 null 值,表示不采用匿名对象的方式。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>实体。</returns>
 public static TView FindOne <TEntity, TView>(this IDbEngine engine, string keyName, object keyValue, Func <TEntity, TView> select, ICommandTunnel tunnel = null)
 => Filter(engine, GetKeyValues <TEntity>(keyName, keyValue)).FindOne(select, tunnel);
예제 #32
0
 public int Remove <TEntity>(ICommandTunnel tunnel = null)
 => this._bus.Call(new CMD.Remove <TEntity> {
     Where = this._where, Tunnel = tunnel
 });
예제 #33
0
 /// <summary>
 /// 判断指定的主键的列名的值是否已存在。
 /// </summary>
 /// <typeparam name="TEntity">实体的数据类型。</typeparam>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="keyName">主键的列名。</param>
 /// <param name="keyValue">主键的列值。</param>
 /// <param name="tunnel">用于个性化表名和命令的暗道,可以为 null 值。</param>
 /// <returns>表示数据是否存在。</returns>
 public static bool Exists <TEntity>(this IDbEngine engine, string keyName, object keyValue, ICommandTunnel tunnel = null)
 => Filter(engine, GetKeyValues <TEntity>(keyName, keyValue)).Exists <TEntity>(tunnel);
예제 #34
0
 public Task <PageData <TEntity> > FindAllAsync <TEntity>(IPagination page, ICommandTunnel tunnel = null)
 => this.FindAllAsync <TEntity, TEntity>(page, tunnel);
예제 #35
0
 public TView FindOne <TEntity, TView>(ICommandTunnel tunnel = null)
 => this._bus.Call(new CMD.FindOne <TEntity, TView> {
     Where = this._where, Tunnel = tunnel
 });
예제 #36
0
 public int Modify <TEntity>(object entity, ICommandTunnel tunnel = null)
 => this._bus.Call(new CMD.Modify <TEntity> {
     Where = this._where, Entity = entity, Tunnel = tunnel
 });