Вопрос. Можно ли каким-либо образом расширить _userManager.FindByEmailAsync() чтобы он запускал Sum, как я это делаю при вызове .Select(), чтобы у меня не было избыточного вызова БД?
Я пытался позвонить:
Код: Выделить всё
var userFromRepo = await _userManager.Users.Select(p => new Core.Entities.User { Id = p.Id, Email = p.Email, UserName = p.UserName}).SingleOrDefaultAsync(p => p.Email == loginDto.Email);
Если я просто вызову это, чтобы вернуть всего пользователя:
Код: Выделить всё
var userFromRepo = await _userManager.Users.SingleOrDefaultAsync(p => p.Email == loginDto.Email);
Я также пытался расширить UserManager таким образом, но безуспешно.
Код: Выделить всё
public static User FindByEmail(this UserManager input, string email) {
return input.Users.Select(p => new User {
Id = p.Id,
Email = p.Email,
UserName = p.UserName
}).SingleOrDefault(x => x.Email == email);
}Вот мой метод входа.
Код: Выделить всё
[AllowAnonymous]
[HttpPost("login")]
public async Task Login(LoginDto loginDto) {
var userFromRepo = await _userManager.FindByEmailAsync(loginDto.Email);
if (userFromRepo == null) return Unauthorized(new ApiResponse(401));
if (userFromRepo.IsActive == false) return NotFound(new ApiResponse(404, "This account is no longer active."));
var result = await _signInManager.CheckPasswordSignInAsync(userFromRepo, loginDto.Password, false);
if (!result.Succeeded) return Unauthorized(new ApiResponse(401));
var user = await _dbContext.Users
.Select(p => new {
Id = p.Id,
Email = p.Email,
UserName = p.UserName,
Hosted = p.Hosted,
Instructed = p.Instructed,
Attended = p.Attended,
IsBoarded = p.IsBoarded,
IsActive = p.IsActive,
Likers = p.LikersCount,
Rating = p.Rating,
YearStarted = p.YearStarted,
YearsInstructing = p.YearsInstructing,
YearsPracticing = System.DateTime.Now.Year - p.YearStarted,
Certification = p.Certification.ToString(),
CreatedDate = p.CreatedDate,
PhotoUrl = p.IsBoarded ? p.UserPhoto : "assets/images/user.png",
Age = p.DateOfBirth.CalculateAge(),
DateOfBirth = p.DateOfBirth,
ExperienceLevel = p.ExperienceLevel.GetEnumName(),
Points = p.UserPoints.Sum(p => p.Points),
Tokens = p.Tokens.Sum(p => p.Tokens),
Token = _tokenService.CreateToken(userFromRepo, (from userRole in p.UserRoles join role in _dbContext.Roles on userRole.RoleId equals role.Id select role.Name).ToList()),
IsInstructor = p.IsInstructor
})
.FirstOrDefaultAsync(p => p.Id == userFromRepo.Id);
if (user == null) return NotFound(new ApiResponse(404));
return Ok(user);
}Подробнее здесь: https://stackoverflow.com/questions/787 ... n-only-wha
Мобильная версия