1
I have a problem with automapper, when I pass a parameter in Linux Express, it seems that it does not make the exchange...
decimal valor = 13;
var model = service.Obter(x => x.DataRegistro == new DateTime(2019, 5, 20));//Esse não funciona
var model = service.Obter(x => x.TipoInformacao == "Teste 002" && x.Realizado == valor);//Esse não funciona
var model = service.Obter(x => x.TipoInformacao == "Teste 002");//Esse funciona sem problemas
var model = service.Obter(x => x.Realizado == valor);//Esse não funciona
Service excerpt:
public DTOPainel Obter(Expression<Func<DTOPainel, bool>> predicate)
    {
        var newPredicate = Mapper.Map<Expression<Func<DTOPainel, bool>>, Expression<Func<Painel, bool>>>(predicate);
        var model = repository.Obter(newPredicate);
        var newModel = Mapper.Map<DTOPainel>(model);
        return newModel;
    }
Error returned by Repository System.Argumentexception: Parameterexpression of type 'Dtopainel' cannot be used for delegate Parameter of type 'Panel'
var newPredicate = Mapper.Map<Expression<Func<DTOPainel, bool>>,Expression<Func<Painel, bool>>>(predicate);
Parameterexpression Type should be 'Panel', but is being passed as 'Dtopainel'
public class AutoMapperConfig
{
    // Versão do AutoMapper: 8.1.0
    public static void RegisterMapping()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<DomainToViewModelMappingProfile>();
            x.AddProfile<ViewModelToDomainMappingProfile>();
        });
    }
}
public class DomainToViewModelMappingProfile : Profile
{
    public DomainToViewModelMappingProfile()
    {
        CreateMap<Painel, DTOPainel>().IgnoreAllPropertiesWithAnInaccessibleSetter();
    }
}
public class ViewModelToDomainMappingProfile : Profile
{
    public ViewModelToDomainMappingProfile()
    {
        CreateMap<DTOPainel, Painel>().IgnoreAllPropertiesWithAnInaccessibleSetter();
    }
}
public class Painel
{
    public int Id { get; set; }
    public DateTime DataRegistro { get; set; }
    public String TipoInformacao { get; set; }
    public decimal Meta { get; set; }
    public decimal Realizado { get; set; }
}
public class DTOPainel
{
    public int Id { get; set; }
    public DateTime DataRegistro { get; set; }
    public String TipoInformacao { get; set; }
    public decimal Meta { get; set; }
    public decimal Realizado { get; set; }
}
public interface IRepository<T> where T : class
{
    void Incluir(T model);
    void Alterar(T model);
    void Excluir(Expression<Func<T, bool>> predicate);
    T Obter(params object[] key);
    T Obter(Expression<Func<T, bool>> predicate);
    IEnumerable<T> Listar();
    IEnumerable<T> Listar(Expression<Func<T, bool>> predicate);
    void Commit();
    void Dispose();
}
public interface IRepositoryPainel : IRepository<Painel>
{
}
public class Repository<T> : IRepository<T>, IDisposable where T : class
{
    protected ApplicationDbContext Context;
    public Repository()
    {
        Context = new ApplicationDbContext();
    }
    public virtual void Incluir(T model)
    {
        Context.Set<T>().Add(model);
    }
    public virtual void Alterar(T model)
    {
        Context.Entry(model).State = EntityState.Modified;
    }
    public virtual void Excluir(Expression<Func<T, bool>> predicate)
    {
        Context.Set<T>().Where(predicate).ToList()
            .ForEach(del => Context.Set<T>().Remove(del));
    }
    public virtual T Obter(params object[] key)
    {
        var model = Context.Set<T>().Find(key);
        if (model != null) Context.Entry(model).Reload();
        return model;
    }
    public virtual T Obter(Expression<Func<T, bool>> predicate)
    {
        return Context.Set<T>().AsNoTracking().Where(predicate).FirstOrDefault();
    }
    public virtual IEnumerable<T> Listar()
    {
        return Context.Set<T>().AsNoTracking();
    }
    public virtual IEnumerable<T> Listar(Expression<Func<T, bool>> predicate)
    {
        return Context.Set<T>().Where(predicate).AsNoTracking();
    }
    public virtual void Commit()
    {
        try
        {
            Context.SaveChanges();
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    public virtual void Dispose()
    {
        if (Context != null)
        {
            Context.Dispose();
        }
        GC.SuppressFinalize(this);
    }
}
public class RepositoryPainel : Repository<Painel>, IRepositoryPainel
{
}
public interface IAppService<T> where T : class
{
    void Incluir(T model);
    void Alterar(T model);
    void Excluir(Expression<Func<T, bool>> predicate);
    T Obter(params object[] key);
    T Obter(Expression<Func<T, bool>> predicate);
    IEnumerable<T> Listar();
    IEnumerable<T> Listar(Expression<Func<T, bool>> predicate);
}
public interface IAppServicePainel : IAppService<DTOPainel>
{
}
public class AppServicePainel : IAppServicePainel
{
    private IRepositoryPainel repository;
    public AppServicePainel()
    {
        repository = new RepositoryPainel();
    }
    public void Incluir(DTOPainel model)
    {
        var newModel = Mapper.Map<Painel>(model);
        repository.Incluir(newModel);
        repository.Commit();
        model.Id = newModel.Id;
    }
    public void Alterar(DTOPainel model)
    {
        var oldModel = repository.Obter(model.Id);
        var newModel = Mapper.Map<DTOPainel, Painel>(model, oldModel);
        repository.Alterar(newModel);
        repository.Commit();
    }
    public void Excluir(Expression<Func<DTOPainel, bool>> predicate)
    {
        var newPredicate = Mapper.Map<Expression<Func<DTOPainel, bool>>, Expression<Func<Painel, bool>>>(predicate);
        repository.Excluir(newPredicate);
        repository.Commit();
    }
    public DTOPainel Obter(params object[] key)
    {
        var model = repository.Obter(key);
        var newModel = Mapper.Map<DTOPainel>(model);
        return newModel;
    }
    public DTOPainel Obter(Expression<Func<DTOPainel, bool>> predicate)
    {
        var newPredicate = Mapper.Map<Expression<Func<DTOPainel, bool>>, Expression<Func<Painel, bool>>>(predicate);
        var model = repository.Obter(newPredicate);
        var newModel = Mapper.Map<DTOPainel>(model);
        return newModel;
    }
    public IEnumerable<DTOPainel> Listar()
    {
        var list = repository.Listar();
        var newList = Mapper.Map<IEnumerable<DTOPainel>>(list);
        return newList;
    }
    public IEnumerable<DTOPainel> Listar(Expression<Func<DTOPainel, bool>> predicate)
    {
        var newPredicate = Mapper.Map<Expression<Func<DTOPainel, bool>>, Expression<Func<Painel, bool>>>(predicate);
        var list = repository.Listar(newPredicate);
        var newList = Mapper.Map<IEnumerable<DTOPainel>>(list);
        return newList;
    }
}
class Program
{
    static void Main(string[] args)
    {
        decimal valor = 13;
        //IRepositoryPainel repository = new RepositoryPainel();
        //var model = repository.Obter(x => x.TipoInformacao == "Teste 002" && x.Realizado == valor);
        //var model = repository.Obter(x => x.DataRegistro == new DateTime(2019, 5, 20));
        AutoMapperConfig.RegisterMapping();
        IAppServicePainel service = new AppServicePainel();
        var model = service.Obter(x => x.DataRegistro == new DateTime(2019, 5, 20));//Esse não funciona
        //var model = service.Obter(x => x.TipoInformacao == "Teste 002" && x.Realizado == valor);//Esse não funciona
        //var model = service.Obter(x => x.TipoInformacao == "Teste 002");//Esse funciona
        //var model = service.Obter(x => x.Realizado == valor);//Esse não funciona
        // Erro retornado pelo Repository
        // System.ArgumentException: ParameterExpression of type 'Treinamento.Application.DTO.DTOPainel' 
        // cannot be used for delegate parameter of type 'Treinamento.Domain.Entity.Painel'
        // é como se o automapper não fizesse a conversão
        // var newPredicate = Mapper.Map<Expression<Func<DTOPainel, bool>>, Expression<Func<Painel, bool>>>(predicate);
        Console.WriteLine("Id: " + model.Id);
        Console.WriteLine("TipoInformacao: " + model.TipoInformacao);
        Console.WriteLine("DataRegistro: " + model.DataRegistro.ToString());
        Console.WriteLine("Realizado: " + model.Realizado.ToString());
        Console.ReadKey();
    }
}