Как расширить или переопределить UserManager.FindByEmail(), чтобы он возвращал только то, что я хочу?C#

Место общения программистов C#
Ответить
Anonymous
 Как расширить или переопределить UserManager.FindByEmail(), чтобы он возвращал только то, что я хочу?

Сообщение Anonymous »

Мой метод входа приведен ниже, и вы увидите, что мне придется снова позвонить своему пользователю после того, как я получу его с помощью _userManager.FindByEmailAsync(), потому что есть несколько полей Points и Tokens, которые рассчитываются как Sum()
Вопрос. Можно ли каким-либо образом расширить _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);
и передайте его в CheckPasswordSignInAsync(), но результат не удался, поэтому он ищет что-то другое, кроме электронной почты, имени пользователя или идентификатора. Но что?
Если я просто вызову это, чтобы вернуть всего пользователя:

Код: Выделить всё

var userFromRepo = await _userManager.Users.SingleOrDefaultAsync(p => p.Email == loginDto.Email);
Это работает, но я не могу запустить вызовы Sum() для Point и Token
Я также пытался расширить 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»