public IEnumerable <T> Query <T>(ICriteria criteria) { var connection = GetConnectionOfFunc(criteria.GetSPName()); var objectList = new List <T>(); using (SqlCommand cmd = new SqlCommand(criteria.GetSPName(), connection)) { cmd.CommandType = CommandType.StoredProcedure; MapValueToDBValue(cmd.Parameters, criteria); connection.Open(); var data = cmd.ExecuteReader(); while (data.Read()) { var newObject = Activator.CreateInstance <T>(); var type = newObject.GetType(); foreach (var property in type.GetProperties()) { if (data[property.Name] != DBNull.Value) { property.SetValue(newObject, data[property.Name]); } } objectList.Add(newObject); } connection.Close(); } return(objectList); }