/// <summary>
        /// Returns role permissions
        /// </summary>
        /// <param name="roleName">Role name</param>
        /// <returns>List of the role permissions</returns>
        public IQueryable<PermissionVm> GetPermissionsByRole(string roleName)
        {
            var parameters = new TbParameters()
                {
                    new SqlParameter()
                    {
                        ParameterName = "@roleName",
                        Value = roleName
                    }
                };

            var reader = _dataReader.ExecuteReader(CommandType.StoredProcedure, SpNames.spGetPermissionsByRole, parameters);
            return reader.Select(Projections.PermissionVmFromReader).AsQueryable();
        }
        /// <summary>
        /// Returns list of projects and project managers
        /// </summary>
        /// <param name="managerName">Manager name</param>
        /// <returns>List of projects and managers</returns>
        public IQueryable<ProjectManagerVm> GetProjectByManagerName(string managerName)
        {
            var parameters = new TbParameters()
                {
                    new SqlParameter()
                    {
                        ParameterName = "@userName",
                        Value = managerName
                    }
                };

            var reader = _dataReader.ExecuteReader(CommandType.StoredProcedure, SpNames.spGetProjectsAndManagers, parameters);
            return reader.Select(Projections.ProjectManagerVmFromReader).AsQueryable();
        }
        /// <summary>
        /// Returns list of user's tasks
        /// </summary>
        /// <param name="userName">User name</param>
        /// <returns>List of user's tasks</returns>
        /// <remarks>In comparison with GetTasksByUserName this method returns less data</remarks>
        public IQueryable<TaskUserVm> GetUserTasks(string userName)
        {
            var parameters = new TbParameters()
                {
                    new SqlParameter()
                    {
                        ParameterName = "@userName",
                        Value = userName
                    }
                };

            var reader = _dataReader.ExecuteReader(CommandType.StoredProcedure, SpNames.spGetUserTasks, parameters);
            return reader.Select(Projections.TaskUserVmFromReader).AsQueryable();
        }
        /// <summary>
        /// Returns list of users including role related to specified project
        /// </summary>
        /// <param name="projectId">Project ID</param>
        /// <returns>List of users with roles</returns>
        public IQueryable<TbUserRoleVm> GetUsersWithRolesByProjectId(long projectId)
        {
            var parameters = new TbParameters()
                {
                    new SqlParameter()
                    {
                        ParameterName = "@projectId",
                        Value = projectId
                    }
                };

            var reader = _dataReader.ExecuteReader(CommandType.StoredProcedure, SpNames.spGetUsersWithRolesByProjectId, parameters);
            return reader.Select(Projections.TbUserRoleVmFromReader).AsQueryable();
        }
        /// <summary>
        /// Returns list of tasks
        /// </summary>
        /// <param name="projectId">Project ID</param>
        /// <returns>If project ID is null returns all the tasks</returns>
        public IQueryable<TaskVm> GetTasks(long? projectId = null)
        {
            SqlDataReader reader = null;

            if(projectId == null)
            {
                reader = _dataReader.ExecuteReader(CommandType.StoredProcedure, SpNames.spGetTasks);
            }
            else
            {
                var parameters = new TbParameters()
                {
                    new SqlParameter()
                    {
                        ParameterName = "@projectId",
                        Value = projectId
                    }
                };
                reader = _dataReader.ExecuteReader(CommandType.StoredProcedure, SpNames.spGetTasks, parameters);
            }
            return reader.Select(Projections.TaskVmFromReader).AsQueryable();
        }
        /// <summary>
        /// Returns task details
        /// </summary>
        /// <param name="id">Task ID</param>
        /// <returns>List of tasks</returns>
        public IQueryable<TaskVm> GetTask(long id)
        {
            var parameters = new TbParameters()
                {
                    new SqlParameter()
                    {
                        ParameterName = "@id",
                        Value = id
                    }
                };

            var reader = _dataReader.ExecuteReader(CommandType.StoredProcedure, SpNames.spGetTask, parameters);
            return reader.Select(Projections.TaskVmFromReader).AsQueryable();
        }