/// <summary> /// 通过实例,查询数据 /// </summary> /// <typeparam name="T">需要返回数据类型</typeparam> /// <param name="connection">对IDbConnection扩展</param> /// <param name="commandText">SQL语句</param> /// <param name="value">映射到SQL语句的实例</param> /// <returns>T类型数据集合</returns> public static IEnumerable<T> QueryByInstance<T>(this IDbConnection connection, string commandText, object value) { //Stopwatch watch = new Stopwatch(); List<T> resultCollection = null; IDataReader reader = null; SqlDelegate<T>.GetReaderInstance instance_func = null; SqlDelegate<T>.GetCommandByInstance command_func = SqlDynamicCache.GetInstanceCommandDelegate<T>(commandText, value); IDbCommand command = connection.CreateCommand(); command_func(ref command, value); bool CloseFlag =( connection.State == ConnectionState.Closed ); try { if (CloseFlag){ connection.Open();} reader = command.ExecuteReader(CommandBehavior.CloseConnection| CommandBehavior.SequentialAccess | CommandBehavior.SingleResult); CloseFlag = false; instance_func = SqlDynamicCache.GetReaderDelegate<T>(reader, commandText); resultCollection = new List<T>(reader.FieldCount); while (reader.Read()) { //watch.Restart(); //T t = instance_func(reader); //watch.Stop(); // System.Console.WriteLine("执行Reader缓存:" + watch.Elapsed); resultCollection.Add(instance_func(reader)); } while (reader.NextResul } reader.Dispose(); reader = null; return resultCollection; }
/// <summary> /// 通过多个实例查询满足条件的数据 /// </summary> /// <typeparam name="T">需要返回数据的类型</typeparam> /// <param name="connection">对IDbConnection扩展</param> /// <param name="commandText">SQL语句</param> /// <param name="values">映射到SQL语句的实例数组</param> /// <returns>T类型集合</returns> public static IEnumerable<T> QueryByInstances<T>(this IDbConnection connection, string commandText, object[] values) { List<T> resultCollection = new List<T>(); SqlDelegate<T>.GetReaderInstance instance_func = null; SqlDelegate<T>.GetCommandByInstance command_func = SqlDynamicCache.GetInstanceCommandDelegate<T>(commandText, values[0]); int i_length = values.Length; IDbCommand command = connection.CreateCommand(); IDataReader reader = null; bool CloseFlag = (connection.State == ConnectionState.Closed); try { if (CloseFlag) { connection.Open(); } for (int i = 0; i < i_length; i += 1) { command_func(ref command, values[i]); reader = command.ExecuteReader(CommandBehavior.CloseConnection | CommandBehavior.SequentialAccess | CommandBehavior.SingleResult); CloseFlag = false; if (instance_func == null) { instance_func = SqlDynamicCache.GetReaderDelegate<T>(reader, commandText); } while (reader.Read()) { T tNode = instance_func(reader); resultCollection.Add(tNode); } while (reader.NextResult()) { } reader.Dispose(); reader = null; } return resultCollection; } finally { if (reader != null) { if (!reader.IsClosed) { try { command.Cancel(); } catch { } } reader.Dispose(); } if (CloseFlag) connection.Close(); command?.Dispose(); } }