You can instantiate the object as an example below. So you can debuggar
(debug) line-by-line:
OcorrenciaRelatorioDTO ocorrenciaRel = new OcorrenciaRelatorioDTO;
ocorrenciaRel.Id = ocorrencia.Id;
ocorrenciaRel.Ocorrencia = ocorrencia.NumOcorrencia;
ocorrenciaRel.Protocolo = ocorrencia.Protocolo;
ocorrenciaRel.Tipo = ocorrencia.Tipo?.Descricao;
ocorrenciaRel.Cliente = ocorrencia.EmpresaCliente.sigla.ToUpper();
ocorrenciaRel.UF = ocorrencia.EmpresaCliente.estado;
ocorrenciaRel.Grupo = ocorrencia.EmpresaCliente.nomeGrupo;
ocorrenciaRel.Representante = ocorrencia.EmpresaRepresentante.nomeFantasia.ToUpper();
ocorrenciaRel.Filial = ocorrencia.EmpresaFilial.sigla.ToUpper();
ocorrenciaRel.Km = ocorrencia.Deslocamento;
ocorrenciaRel.Motivo = ocorrencia.Motivo?.Descricao;
ocorrenciaRel.DataHoraAbertura = ocorrencia.DataHoraAbertura;
ocorrenciaRel.Equipamento = ocorrencia.NomeEquipamentoFocus;
ocorrenciaRel.Serie = ocorrencia.Serie;
ocorrenciaRel.DataHoraAgendada = ocorrencia.DataHoraAgendada;
ocorrenciaRel.DataHoraAtendimento = ocorrencia.DataHoraAtendimento;
ocorrenciaRel.DataHoraFechamento = ocorrencia.DataHoraFechamento;
ocorrenciaRel.Status = ocorrencia.Status?.Descricao;
ocorrenciaRel.Solucao = ocorrencia.Solucao?.Descricao;
ocorrenciaRel.Observacao = ocorrencia.Observacao;
ocorrenciaRel.Conclusao = ocorrencia.Conclusao?.Descricao;
ocorrenciaRel.OrdemServico = ocorrencia.OrdemServico;
ocorrenciaRel.Orcamento1 = ocorrencia.NumOrcamento;
ocorrenciaRel.Orcamento2 = ocorrencia.NumOrcamento2;
ocorrenciaRel.CedulasProcessadas = ocorrencia.CedulasProcessadas;
ocorrenciaRel.Tecnico = ocorrencia.OcorrenciaTecnico?.FirstOrDefault().Nome;
ocorrenciaRel.CobrarDeslocamento = ocorrencia.CobrarDeslocamento ? "Sim" : "Não";
ocorrenciaRel.CobrarAtendimento = ocorrencia.CobrarAtendimento ? "Sim" : "Não";
It is common to come across these problems and you can get around in different ways. Some have already given some suggestions in the other answers that prevent your code from breaking. Reinforcing that it is always important to check if a property is null before using it.
I usually, in some cases I know that there may be some problem in assigning the data already keep in the way I gave the above example. Because the shape that is in your code (depending on the class) becomes a disadvantage to debug and locate the problem in the code. So consider in your case what’s best.
In other cases, you can switch to the form I gave the example just to locate the problem and return to instantiation as before, if you think the code is safe and easy to understand (I do not find the most elegant, see below).
For your specific case I would choose to use a public static explict operator
because you are basically making a conversion from one method to another that has very similar characteristics.
To simplify this example I will use smaller example classes:
Example class (Entity):
public class MinhaEntidade
{
public long Id { get; set; }
public string Prop1 { get; set; }
public bool Prop2 { get; set; }
public DateTime? Prop3 { get; set; }
public static explicit operator MinhaEntidade(MinhaEntidadeDTO entidadeDTO)
{
return new MinhaEntidade
{
Id = entidadeDTO.Id,
Prop1 = entidadeDTO.Prop1,
Prop2 = entidadeDTO.Prop2,
Prop3 = entidadeDTO.Prop3,
};
}
}
Example class (DTO):
public class MinhaEntidadeDTO
{
public long Id { get; set; }
public string Prop1 { get; set; }
public bool Prop2 { get; set; }
public DateTime? Prop3 { get; set; }
//Propriedade não utilizada na conversão da classe.
//As classes não precisam ter as mesmas proprieades para utlização do explicit operator
public DateTime? PropXYZ { get; set; }
public static explicit operator MinhaEntidadeDTO(MinhaEntidade entidade)
{
return new MinhaEntidadeDTO
{
Id = entidade.Id,
Prop1 = entidade.Prop1,
Prop2 = entidade.Prop2,
Prop3 = entidade.Prop3,
};
}
}
Converting from one entity to another would be so simple:
MinhaEntidadeDTO entidadeDTO = (MinhaEntidadeDTO )_db.MinhaEntidade
.Where(id == 1).SingleOrDefault();
The great advantage is no need to repeat the code to convert the object from one to the other whenever performing this operation. And you can change the method by validating the data with the tips I gave earlier and/or use the way I gave the first example in the method static explict operator
facilitating the debugging.
Understand more about the explict reading the Microsoft documentation.
Yeah, I always end up doing it, but there’s no way I don’t have to do it?
– Taian
@Taian, there are some other ways to instantiate the object yes, it can be a constructor where you can treat this data that can give some problem, a method, but in the end it will be something similar and I don’t think it will be easier for you. I will complement a little the answer giving some tips
– George Wurthmann
@Taian, I updated the answer. I hope it helps you.
– George Wurthmann