/// <summary>
        /// 异步执行 SQL 语句,并返回两个实体集合
        /// </summary>
        /// <param name="query1">SQL 命令</param>
        /// <param name="query2">SQL 命令</param>
        /// <param name="query3">SQL 命令</param>
        public override async Task <Tuple <List <T1>, List <T2>, List <T3> > > ExecuteAsync <T1, T2, T3>(IDbQueryable <T1> query1, IDbQueryable <T2> query2, IDbQueryable <T3> query3)
        {
            List <T1>           q1      = null;
            List <T2>           q2      = null;
            List <T3>           q3      = null;
            IDataReader         reader  = null;
            List <DbRawCommand> sqlList = query1.Provider.Translate(new List <object> {
                query1, query2, query3
            });
            List <IMapDescriptor> maps = sqlList.ToList(a => a is IMapDescriptor, a => a as IMapDescriptor);

            TypeDeserializer deserializer1 = null;
            TypeDeserializer deserializer2 = null;
            TypeDeserializer deserializer3 = null;

            Func <System.Data.Common.DbCommand, Task <object> > doExecute = async cmd =>
            {
                reader = await base.ExecuteReaderAsync(cmd);

                do
                {
                    if (q1 == null)
                    {
                        deserializer1 = new TypeDeserializer(_context, reader, maps.Count > 0 ? maps[0] : null);
                        q1            = deserializer1.Deserialize <List <T1> >();
                    }
                    else if (q2 == null)
                    {
                        deserializer2 = new TypeDeserializer(_context, reader, maps.Count > 1 ? maps[1] : null);
                        q2            = deserializer2.Deserialize <List <T2> >();
                    }
                    else if (q3 == null)
                    {
                        deserializer3 = new TypeDeserializer(_context, reader, maps.Count > 2 ? maps[2] : null);
                        q3            = deserializer3.Deserialize <List <T3> >();
                    }
                }while (reader.NextResult());

                // 释放当前的reader
                if (reader != null)
                {
                    reader.Dispose();
                }
                return(null);
            };

            try
            {
                await base.DoExecuteAsync <object>(sqlList, doExecute);

                return(new Tuple <List <T1>, List <T2>, List <T3> >(q1, q2, q3));
            }
            finally
            {
                if (reader != null)
                {
                    reader.Dispose();
                }
            }
        }
Example #2
0
        /// <summary>
        /// 计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改
        /// </summary>
        /// <returns></returns>
        public virtual async Task <int> SubmitChangesAsync()
        {
            int rowCount = _dbQueryables.Count;

            if (rowCount == 0)
            {
                return(0);
            }

            IDataReader         reader    = null;
            List <int>          identitys = new List <int>();
            List <DbRawCommand> sqlList   = this.Translate();

            try
            {
                Func <IDbCommand, Task <object> > func = async cmd =>
                {
                    reader = await this.Database.ExecuteReaderAsync(cmd);

                    TypeDeserializer deserializer = new TypeDeserializer(this, reader, null);
                    do
                    {
                        List <int> result = null;
                        deserializer.Deserialize <int>(out result);
                        if (result != null && result.Count > 0)
                        {
                            identitys.AddRange(result);
                        }
                    }while (reader.NextResult());

                    // 释放当前的reader
                    if (reader != null)
                    {
                        reader.Dispose();
                    }

                    return(null);
                };

                await this.Database.ExecuteAsync <object>(sqlList, func);

                this.SetIdentityValue(_dbQueryables, identitys);
                return(rowCount);
            }
            finally
            {
                if (reader != null)
                {
                    reader.Dispose();
                }
                this.InternalDispose();
            }
        }
Example #3
0
        // datareader 转实体
        T GetResult <T>(IDataReader reader, IMapDescriptor map)
        {
            T result = default(T);

            if (typeof(T) == typeof(DataTable))
            {
                DataTable table = new DataTable();
                table.Load(reader);
                result = (T)(object)table;
            }
            else if (typeof(T) == typeof(DataSet))
            {
                InternalDataSet data = new InternalDataSet();
                data.Load(reader, LoadOption.OverwriteChanges, null, new DataTable[] { });
                result = (T)(object)data;
            }
            else
            {
                TypeDeserializer deserializer = new TypeDeserializer(_context, reader, map);
                result = deserializer.Deserialize <T>();
            }
            return(result);
        }
Example #4
0
        /// <summary>
        /// 计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改。
        /// 同时返回通过 AddQuery 添加的查询语义对应的实体序列。
        /// 如果通过 AddQuery 添加了多个查询语义,只返回第一至第七个查询语义对应的实体序列。
        /// </summary>
        /// <typeparam name="T1">要返回的元素类型</typeparam>
        /// <typeparam name="T2">要返回的元素类型</typeparam>
        /// <typeparam name="T3">要返回的元素类型</typeparam>
        /// <typeparam name="T4">要返回的元素类型</typeparam>
        /// <typeparam name="T5">要返回的元素类型</typeparam>
        /// <typeparam name="T6">要返回的元素类型</typeparam>
        /// <typeparam name="T7">要返回的元素类型</typeparam>
        /// <param name="result1">第一个通过 AddQuery 添加的查询语义对应的实体序列</param>
        /// <param name="result2">第二个通过 AddQuery 添加的查询语义对应的实体序列</param>
        /// <param name="result3">第三个通过 AddQuery 添加的查询语义对应的实体序列</param>
        /// <param name="result4">第四个通过 AddQuery 添加的查询语义对应的实体序列</param>
        /// <param name="result5">第五个通过 AddQuery 添加的查询语义对应的实体序列</param>
        /// <param name="result6">第六个通过 AddQuery 添加的查询语义对应的实体序列</param>
        /// <param name="result7">第七个通过 AddQuery 添加的查询语义对应的实体序列</param>
        /// <returns></returns>
        public virtual int SubmitChanges <T1, T2, T3, T4, T5, T6, T7>(out List <T1> result1, out List <T2> result2, out List <T3> result3, out List <T4> result4, out List <T5> result5, out List <T6> result6, out List <T7> result7)
        {
            result1 = new List <T1>();
            result2 = new List <T2>();
            result3 = new List <T3>();
            result4 = new List <T4>();
            result5 = new List <T5>();
            result6 = new List <T6>();
            result7 = new List <T7>();
            int rowCount = _dbQueryables.Count;

            if (rowCount == 0)
            {
                return(0);
            }

            List <T1>             q1        = null;
            List <T2>             q2        = null;
            List <T3>             q3        = null;
            List <T4>             q4        = null;
            List <T5>             q5        = null;
            List <T6>             q6        = null;
            List <T7>             q7        = null;
            IDataReader           reader    = null;
            List <int>            identitys = null;
            List <DbRawCommand>   sqlList   = this.Translate();
            List <IMapDescriptor> maps      = sqlList.ToList(a => a is IMapDescriptor, a => a as IMapDescriptor);

            Func <IDbCommand, object> doExecute = cmd =>
            {
                reader = this.Database.ExecuteReader(cmd);
                TypeDeserializer deserializer1 = null;
                TypeDeserializer deserializer2 = null;
                TypeDeserializer deserializer3 = null;
                TypeDeserializer deserializer4 = null;
                TypeDeserializer deserializer5 = null;
                TypeDeserializer deserializer6 = null;
                TypeDeserializer deserializer7 = null;
                do
                {
                    if (q1 == null)
                    {
                        // 先查第一个类型集合
                        List <int> autoIncrements = null;
                        if (deserializer1 == null)
                        {
                            deserializer1 = new TypeDeserializer(this, reader, maps.Count > 0 ? maps[0] : null);
                        }
                        var collection = deserializer1.Deserialize <T1>(out autoIncrements);

                        if (autoIncrements != null)
                        {
                            if (identitys == null)
                            {
                                identitys = new List <int>();
                            }
                            identitys.AddRange(autoIncrements);
                        }
                        else if (collection != null)
                        {
                            q1 = collection;
                        }
                    }
                    else if (q2 == null)
                    {
                        // 再查第二个类型集合
                        List <int> autoIncrements = null;
                        if (deserializer2 == null)
                        {
                            deserializer2 = new TypeDeserializer(this, reader, maps.Count > 1 ? maps[1] : null);
                        }
                        var collection = deserializer2.Deserialize <T2>(out autoIncrements);

                        if (autoIncrements != null)
                        {
                            if (identitys == null)
                            {
                                identitys = new List <int>();
                            }
                            identitys.AddRange(autoIncrements);
                        }
                        else if (collection != null)
                        {
                            if (q2 == null)
                            {
                                q2 = collection;
                            }
                        }
                    }
                    else if (q3 == null)
                    {
                        // 再查第三个类型集合
                        List <int> autoIncrements = null;
                        if (deserializer3 == null)
                        {
                            deserializer3 = new TypeDeserializer(this, reader, maps.Count > 2 ? maps[2] : null);
                        }
                        var collection = deserializer3.Deserialize <T3>(out autoIncrements);

                        if (autoIncrements != null)
                        {
                            if (identitys == null)
                            {
                                identitys = new List <int>();
                            }
                            identitys.AddRange(autoIncrements);
                        }
                        else if (collection != null)
                        {
                            if (q3 == null)
                            {
                                q3 = collection;
                            }
                        }
                    }
                    else if (q4 == null)
                    {
                        // 再查第四个类型集合
                        List <int> autoIncrements = null;
                        if (deserializer4 == null)
                        {
                            deserializer4 = new TypeDeserializer(this, reader, maps.Count > 3 ? maps[3] : null);
                        }
                        var collection = deserializer4.Deserialize <T4>(out autoIncrements);

                        if (autoIncrements != null)
                        {
                            if (identitys == null)
                            {
                                identitys = new List <int>();
                            }
                            identitys.AddRange(autoIncrements);
                        }
                        else if (collection != null)
                        {
                            if (q4 == null)
                            {
                                q4 = collection;
                            }
                        }
                    }
                    else if (q5 == null)
                    {
                        // 再查第五个类型集合
                        List <int> autoIncrements = null;
                        if (deserializer5 == null)
                        {
                            deserializer5 = new TypeDeserializer(this, reader, maps.Count > 4 ? maps[4] : null);
                        }
                        var collection = deserializer5.Deserialize <T5>(out autoIncrements);

                        if (autoIncrements != null)
                        {
                            if (identitys == null)
                            {
                                identitys = new List <int>();
                            }
                            identitys.AddRange(autoIncrements);
                        }
                        else if (collection != null)
                        {
                            if (q5 == null)
                            {
                                q5 = collection;
                            }
                        }
                    }
                    else if (q6 == null)
                    {
                        // 再查第六个类型集合
                        List <int> autoIncrements = null;
                        if (deserializer6 == null)
                        {
                            deserializer6 = new TypeDeserializer(this, reader, maps.Count > 5 ? maps[5] : null);
                        }
                        var collection = deserializer6.Deserialize <T6>(out autoIncrements);

                        if (autoIncrements != null)
                        {
                            if (identitys == null)
                            {
                                identitys = new List <int>();
                            }
                            identitys.AddRange(autoIncrements);
                        }
                        else if (collection != null)
                        {
                            if (q6 == null)
                            {
                                q6 = collection;
                            }
                        }
                    }
                    else
                    {
                        // 再查第七个类型集合
                        List <int> autoIncrements = null;
                        if (deserializer7 == null)
                        {
                            deserializer7 = new TypeDeserializer(this, reader, maps.Count > 6 ? maps[6] : null);
                        }
                        var collection = deserializer7.Deserialize <T7>(out autoIncrements);

                        if (autoIncrements != null)
                        {
                            if (identitys == null)
                            {
                                identitys = new List <int>();
                            }
                            identitys.AddRange(autoIncrements);
                        }
                        else if (collection != null)
                        {
                            if (q7 == null)
                            {
                                q7 = collection;
                            }
                        }
                    }
                }while (reader.NextResult());

                // 释放当前的reader
                if (reader != null)
                {
                    reader.Dispose();
                }
                return(null);
            };

            try
            {
                this.Database.Execute <object>(sqlList, doExecute);
                result1 = q1 ?? new List <T1>(0);
                result2 = q2 ?? new List <T2>(0);
                result3 = q3 ?? new List <T3>(0);
                result4 = q4 ?? new List <T4>(0);
                result5 = q5 ?? new List <T5>(0);
                result6 = q6 ?? new List <T6>(0);
                result7 = q7 ?? new List <T7>(0);
                this.SetIdentityValue(_dbQueryables, identitys);
                return(rowCount);
            }
            finally
            {
                if (reader != null)
                {
                    reader.Dispose();
                }
                this.InternalDispose();
            }
        }
Example #5
0
        /// <summary>
        /// 执行 SQL 语句,并返回多个实体集合
        /// </summary>
        /// <typeparam name="T1">第一个列表的元素类型</typeparam>
        /// <typeparam name="T2">第二个列表的元素类型</typeparam>
        /// <typeparam name="T3">第三个列表的元素类型</typeparam>
        /// <typeparam name="T4">第四个列表的元素类型</typeparam>
        /// <typeparam name="T5">第五个列表的元素类型</typeparam>
        /// <typeparam name="T6">第六个列表的元素类型</typeparam>
        /// <typeparam name="T7">第七个列表的元素类型</typeparam>
        /// <param name="command">SQL 命令</param>
        /// <param name="maps">实体映射描述列表</param>
        /// <returns></returns>
        protected override Tuple <List <T1>, List <T2>, List <T3>, List <T4>, List <T5>, List <T6>, List <T7> > Execute <T1, T2, T3, T4, T5, T6, T7>(IDbCommand command, List <IMapDescriptor> maps = null)
        {
            List <T1>           q1     = null;
            List <T2>           q2     = null;
            List <T3>           q3     = null;
            List <T4>           q4     = null;
            List <T5>           q5     = null;
            List <T6>           q6     = null;
            List <T7>           q7     = null;
            IDataReader         reader = null;
            List <DbRawCommand> myList = this.ParseCommand(command.CommandText, command.Parameters, command.CommandType);

            if (myList == null)
            {
                q1 = this.Execute <List <T1> >(command, maps != null && maps.Count > 0 ? maps[0] : null);
            }
            else
            {
                TypeDeserializer deserializer1 = null;
                TypeDeserializer deserializer2 = null;
                TypeDeserializer deserializer3 = null;
                TypeDeserializer deserializer4 = null;
                TypeDeserializer deserializer5 = null;
                TypeDeserializer deserializer6 = null;
                TypeDeserializer deserializer7 = null;

                Func <IDbCommand, object> doExecute = cmd =>
                {
                    reader = base.ExecuteReader(cmd);
                    do
                    {
                        if (q1 == null)
                        {
                            deserializer1 = new TypeDeserializer(_context, reader, maps != null && maps.Count > 0 ? maps[0] : null);
                            q1            = deserializer1.Deserialize <List <T1> >();
                        }
                        else if (q2 == null)
                        {
                            deserializer2 = new TypeDeserializer(_context, reader, maps != null && maps.Count > 1 ? maps[1] : null);
                            q2            = deserializer2.Deserialize <List <T2> >();
                        }
                        else if (q3 == null)
                        {
                            deserializer3 = new TypeDeserializer(_context, reader, maps != null && maps.Count > 2 ? maps[2] : null);
                            q3            = deserializer3.Deserialize <List <T3> >();
                        }
                        else if (q4 == null)
                        {
                            deserializer4 = new TypeDeserializer(_context, reader, maps != null && maps.Count > 3 ? maps[3] : null);
                            q4            = deserializer4.Deserialize <List <T4> >();
                        }
                        else if (q5 == null)
                        {
                            deserializer5 = new TypeDeserializer(_context, reader, maps != null && maps.Count > 4 ? maps[4] : null);
                            q5            = deserializer5.Deserialize <List <T5> >();
                        }
                        else if (q6 == null)
                        {
                            deserializer6 = new TypeDeserializer(_context, reader, maps != null && maps.Count > 5 ? maps[5] : null);
                            q6            = deserializer6.Deserialize <List <T6> >();
                        }
                        else if (q7 == null)
                        {
                            deserializer7 = new TypeDeserializer(_context, reader, maps != null && maps.Count > 6 ? maps[6] : null);
                            q7            = deserializer7.Deserialize <List <T7> >();
                        }
                    }while (reader.NextResult());

                    // 释放当前的reader
                    if (reader != null)
                    {
                        reader.Dispose();
                    }
                    return(null);
                };

                try
                {
                    base.DoExecute <object>(myList, doExecute);
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Dispose();
                    }
                }
            }

            return(new Tuple <List <T1>, List <T2>, List <T3>, List <T4>, List <T5>, List <T6>, List <T7> >(
                       q1 ?? new List <T1>(), q2 ?? new List <T2>(), q3 ?? new List <T3>(), q4 ?? new List <T4>(), q5 ?? new List <T5>(), q6 ?? new List <T6>(), q7 ?? new List <T7>()));
        }
Example #6
0
        /// <summary>
        /// 执行 SQL 语句,并返回多个实体集合
        /// </summary>
        /// <typeparam name="T1">第一个列表的元素类型</typeparam>
        /// <typeparam name="T2">第二个列表的元素类型</typeparam>
        /// <typeparam name="T3">第三个列表的元素类型</typeparam>
        /// <typeparam name="T4">第四个列表的元素类型</typeparam>
        /// <typeparam name="T5">第五个列表的元素类型</typeparam>
        /// <typeparam name="T6">第六个列表的元素类型</typeparam>
        /// <typeparam name="T7">第七个列表的元素类型</typeparam>
        /// <param name="command">SQL 命令</param>
        /// <param name="maps">实体映射描述列表</param>
        /// <returns></returns>
        protected virtual Tuple <List <T1>, List <T2>, List <T3>, List <T4>, List <T5>, List <T6>, List <T7> > Execute <T1, T2, T3, T4, T5, T6, T7>(IDbCommand command, List <IMapDescriptor> maps = null)
        {
            IDataReader reader = null;
            List <T1>   q1     = null;
            List <T2>   q2     = null;
            List <T3>   q3     = null;
            List <T4>   q4     = null;
            List <T5>   q5     = null;
            List <T6>   q6     = null;
            List <T7>   q7     = null;

            TypeDeserializer deserializer1 = null;
            TypeDeserializer deserializer2 = null;
            TypeDeserializer deserializer3 = null;
            TypeDeserializer deserializer4 = null;
            TypeDeserializer deserializer5 = null;
            TypeDeserializer deserializer6 = null;
            TypeDeserializer deserializer7 = null;

            try
            {
                int i = 0;
                reader = this.ExecuteReader(command);

                do
                {
                    i += 1;

                    switch (i)
                    {
                        #region 元组赋值

                    case 1:
                        if (deserializer1 == null)
                        {
                            deserializer1 = new TypeDeserializer(_context, reader, maps != null && maps.Count > i - 1 ? maps[i - 1] : null);
                        }
                        q1 = deserializer1.Deserialize <List <T1> >();

                        break;

                    case 2:
                        if (deserializer2 == null)
                        {
                            deserializer2 = new TypeDeserializer(_context, reader, maps != null && maps.Count > i - 1 ? maps[i - 1] : null);
                        }
                        q2 = deserializer2.Deserialize <List <T2> >();

                        break;

                    case 3:
                        if (deserializer3 == null)
                        {
                            deserializer3 = new TypeDeserializer(_context, reader, maps != null && maps.Count > i - 1 ? maps[i - 1] : null);
                        }
                        q3 = deserializer3.Deserialize <List <T3> >();

                        break;

                    case 4:
                        if (deserializer4 == null)
                        {
                            deserializer4 = new TypeDeserializer(_context, reader, maps != null && maps.Count > i - 1 ? maps[i - 1] : null);
                        }
                        q4 = deserializer4.Deserialize <List <T4> >();

                        break;

                    case 5:
                        if (deserializer5 == null)
                        {
                            deserializer5 = new TypeDeserializer(_context, reader, maps != null && maps.Count > i - 1 ? maps[i - 1] : null);
                        }
                        q5 = deserializer5.Deserialize <List <T5> >();

                        break;

                    case 6:
                        if (deserializer6 == null)
                        {
                            deserializer6 = new TypeDeserializer(_context, reader, maps != null && maps.Count > i - 1 ? maps[i - 1] : null);
                        }
                        q6 = deserializer6.Deserialize <List <T6> >();

                        break;

                    case 7:
                        if (deserializer7 == null)
                        {
                            deserializer7 = new TypeDeserializer(_context, reader, maps != null && maps.Count > i - 1 ? maps[i - 1] : null);
                        }
                        q7 = deserializer7.Deserialize <List <T7> >();

                        break;

                        #endregion
                    }
                }while (reader.NextResult());
            }
            finally
            {
                if (command != null)
                {
                    command.Dispose();
                }
                if (reader != null)
                {
                    reader.Dispose();
                }
                this.InternalDispose();
            }

            return(new Tuple <List <T1>, List <T2>, List <T3>, List <T4>, List <T5>, List <T6>, List <T7> >(q1 ?? new List <T1>(), q2 ?? new List <T2>(), q3 ?? new List <T3>(), q4 ?? new List <T4>(), q5 ?? new List <T5>(), q6 ?? new List <T6>(), q7 ?? new List <T7>()));
        }