skylake
skylake

Reputation: 417

Cannot implicity convert type ApplicationUser to User

 Cannot implicitly convert type
 'System.Collections.Generic.List<xxxx.Models.ApplicationUser>' to
 'System.Collections.Generic.IEnumerable<xxxx.User>'. An explicit
 conversion exists (are you missing a cast?)

I can't find anything related to this issue. I created an API-folder inside Controllers folder, added UserController in API folder and then wrote the following:

(get the error at return _context.Users.ToList();)

namespace xxxx.Controllers.API {
    public class UserController : ApiController
    {

        private ApplicationDbContext _context;

        public UserController() {
            _context = new ApplicationDbContext();
        }

        //GET /api/users
        public IEnumerable<User> GetUsers()
        {

            return _context.Users.ToList(); //<-- where I get the error message
        }

This is my model for user:

public partial class User
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public User()
    {            
        this.Reviews = new HashSet<Review>();
    }

    public System.Guid Id { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Review> Reviews { get; set; }

}

Any idea how to solve this?

Upvotes: 3

Views: 3054

Answers (1)

Gavin
Gavin

Reputation: 4515

Your method returns IEnumerable<User>, but _context.Users must get you type ApplicationUser. You will have to convert these to type User, or have your method return IEnumerable<ApplicationUser>.

To do the conversion, I like to use Transformers. I usually implement an interface

public interface ITransformer<in TSource, out TOutput>
{
    TOutput Transform(TSource source);
}

An example transformer would be

public class AppUserToUserTransformer : ITransformer<ApplicationUser, User>
{
    public User Transform(ApplicationUser source)
    {
        return new User
        {
            Username = source.Username;
            Email = source.Email;
            //continue with the rest of the available properties
        };
    }
} 

Upvotes: 6

Related Questions