ASP.NET 核心 Web API - 如何解决错误 CS0103 名称"分数"在当前上下文中不存在



在ASP.NET Core 6中,我有以下代码。

public static class Paginator
{
public static async Task<PageResult<IEnumerable<TDestination>>> PaginationAsync<TSource, TDestination>(this IQueryable<TSource> queryable, int pageSize, int pageNumber, IMapper mapper)
where TSource : class
where TDestination : class
{
var count = queryable.Count();
var pageResult = new PageResult<IEnumerable<TDestination>>
{
PageSize = (pageSize > 10 || pageSize < 1) ? 10 : pageSize,
CurrentPage = pageNumber > 1 ? pageNumber : 1,
TotalRecord = count,
PreviousPage = pageNumber > 0 ? pageNumber - 1 : 0
};
pageResult.NumberOfPages = count % pageResult.PageSize != 0
? count / pageResult.PageSize + 1
: count / pageResult.PageSize;
var sourceList = await queryable.Skip((pageResult.CurrentPage - 1) * pageResult.PageSize).Take(pageResult.PageSize).ToListAsync();
var destinationList = mapper.Map<IEnumerable<TSource>, IEnumerable<TDestination>>(sourceList);
pageResult.PageItems = destinationList;
return pageResult;
}
}

存储库接口:

IQueryable<Score> GetExamScoreAsync(PagingFilter filter)

存储库实现:

public IQueryable<Score> GetExamScoreAsync(PagingFilter filter)
{
var examScores = _dbContext.Scores
.Where(m => (bool)m.Approval.IsFirstLevel == false)
.Where(x => string.IsNullOrEmpty(filter.SearchQuery)
|| x.Subject.ToLower().Contains(filter.SearchQuery.ToLower())
|| x.StartDate.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture).Contains(filter.SearchQuery.ToLower())
|| x.EndDate.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture).Contains(filter.SearchQuery.ToLower()))
.OrderByDescending(x => x.CreatedAt);
return examScores;
}

然后我称之为服务:

public async Task<Response<PageResult<IEnumerable<ScoreListDto>>>> GetScoreAsync(PagingFilter filter)
{
var userName = _currentUserService.UserName;
var getUser = await _userManager.FindByNameAsync(userName);
var loggedUserRole = await _userManager.GetRolesAsync(getUser);
var loggedUserRoleName = loggedUserRole[0].ToString();
if (loggedUserRoleName == "Student")
{
var score = await _unitOfWork.ExamScore.GetExamScoreStudentAsync(filter);
}
else
{
var score = await _unitOfWork.ExamScore.GetExamScoreAsync(filter);
}

var item = await score.PaginationAsync<Score, ScoreListDto>(filter.PageSize, filter.PageNumber, _mapper);
return new Response<PageResult<IEnumerable<ScoreListDto>>>()
{
StatusCode = (int)HttpStatusCode.OK,
Successful = true,
Data = item
};
}

我得到了这个错误:

错误CS0103当前上下文中不存在名称"score">

分数突出显示在:中

var item = await score.PaginationAsync<Score, ScoreListDto>(filter.PageSize, filter.PageNumber, _mapper);

如何解决此问题?

感谢

定义var score(在if {}else{}之间(的每个块确定变量的范围。在您可能更习惯的Javascript中,var的作用域是";"吊装";到函数的顶层。C#中的情况并非如此。您必须在要使用的范围内声明变量。因此,您必须在if语句之前定义它,以便在调用score.PaginationAsync调用时可以使用它。类似这样的东西:

MyScoreType score;
if (loggedUserRoleName == "Student")
{
score = await _unitOfWork.ExamScore.GetExamScoreStudentAsync(filter);
}
else
{
score = await _unitOfWork.ExamScore.GetExamScoreAsync(filter);
}

另一种方法是内联if语句,如下所示:

var score = (loggedUserRoleName == "Student")
? await _unitOfWork.ExamScore.GetExamScoreStudentAsync(filter)
: (loggedUserRoleName == "Teacher")
? await _unitOfWork.ExamScore.GetExamScoreTeacherAsync(filter)
: await _unitOfWork.ExamScore.GetExamScoreAsync(filter);

您在if-else语句中声明了'score'变量,因此它的作用域仅保留在if-erse语句中。只要在if语句之前声明它,它就应该是可访问的。

var score = new Score(); //Assuming Score is the data type your varaiable has
if (loggedUserRoleName == "Student")
{
score = await _unitOfWork.ExamScore.GetExamScoreStudentAsync(filter);
}
else
{
score = await _unitOfWork.ExamScore.GetExamScoreAsync(filter);
}

相关内容

最新更新