Reputation: 3238
I suppose that reason of AutoMapper failed is slightly different fields of domain model and view model. Here is domain model:
public partial class Users
{
public int Id { get; set; }
public string Login { get; set; }
public string Password { get; set; }
public int RoleId { get; set; }
public virtual UserRoles UserRoles { get; set; }
}
So here is view model:
public class UsersViewModel
{
public int Id { get; set; }
[Required]
[MinLength(3, ErrorMessage = "Минимальная длина логина - 3 символа")]
[MaxLength(50, ErrorMessage = "Максимальная длина логина - 50 символов")]
[Display(Name = "Логин")]
public string Login { get; set; }
[Required]
[MinLength(8, ErrorMessage = "Минимальная длина пароля - 8 символов")]
[MaxLength(50, ErrorMessage = "Максимальная длина пароля - 50 символов")]
[Display(Name = "Пароль")]
public string Password { get; set; }
[Required]
[Display(Name = "Роль")]
public int RoleId { get; set; }
public IEnumerable<SelectListItem> UsrRoles { get; set; }
public virtual UserRoles UserRoles { get; set; }
}
Is this filed public IEnumerable<SelectListItem> UsrRoles { get; set; }
could be reason why AutoMapper failed?
I call mapping this way:
public async Task<IEnumerable<UsersViewModel>> GetUsersList()
{
var t = new Task<IEnumerable<Users>>(() => _db.Users.ToEnumerable());
t.Start();
await t;
var vm = Mapper.Map<Task<IEnumerable<Users>>, Task<IEnumerable<UsersViewModel>>>(t);
return vm.Result.OrderBy(x => x.Login);
}
Upvotes: 1
Views: 121
Reputation: 3238
I got even better solution, thanks to shf301. You was right that I tried to map Task instead of IEnumerable.
public async Task<IEnumerable<UsersViewModel>> GetUsersList()
{
var t = new Task<IEnumerable<Users>>(() => _db.Users.ToEnumerable());
t.Start();
IEnumerable<Users> z = await t;
var vm = Mapper.Map<IEnumerable<Users>, IEnumerable<UsersViewModel>>(z);
return vm.OrderBy(x => x.Login);
}
Upvotes: 0
Reputation: 31394
It's failing because you are trying to map Task
's not Users
to UsersViewModel
. You want:
public async Task<IEnumerable<UsersViewModel>> GetUsersList()
{
var users = await new Task<IEnumerable<Users>>(() => _db.Users.ToEnumerable());
var vm = Mapper.Map<IEnumerable<Users>, IEnumerable<UsersViewModel>>(users);
return vm.Result.OrderBy(x => x.Login);
}
await
will return the result of the Task, which is what you want, not the task itself.
Your other option would be calling t.Result
which would return the IEnumerable<Users>
list.
Upvotes: 1