I'd like to know first what the difference between Func<T, bool>
to Expression<Func<T, bool>>
And how do I convert from Func<T, bool>
to Expression<Func<T, bool>>
if it's possible.
Or else I need all my code to be Expression instead of Func. But I do not know how to convert and concatenate Expression. In the Filter () method.
public class MovimentoTratamento : Tratamento
{
public string Nr_Nota_Fiscal { get; set; }
public string Dt_Emissao_Nota_Fiscal { get; set; }
}
public abstract class Tratamento
{
[Key]
public int ID{ get; set; }
public string Cd_Sap_Distribuidor_Matriz { get; set; }
public string Cd_Sap_Distribuidor_Filial { get; set; }
public DateTime Dt_Criacao { get; set; }
public int Id_Log { get; set; }
}
private Func<Tratamento, bool> FiltroPadrao(FiltroViewModel filtroViewModel)
{
DateTime inicial, final;
DateTime.TryParse(filtroViewModel.CargaInicial, out inicial);
DateTime.TryParse(filtroViewModel.CargaFinal, out final);
Func<Tratamento, bool> f = x =>
((final == DateTime.MinValue) || (x.Dt_Criacao >= inicial && x.Dt_Criacao <= final.AddDays(1)))
&&
(string.IsNullOrEmpty(filtroViewModel.CnpjMatriz) || x.Cd_Sap_Distribuidor_Matriz == filtroViewModel.CnpjMatriz)
&&
(string.IsNullOrEmpty(filtroViewModel.CnpjFilial) || x.Cd_Sap_Distribuidor_Filial == filtroViewModel.CnpjFilial)
&&
(filtroViewModel.TipoErro == "0" || x.Cd_Erro == filtroViewModel.TipoErro)
&&
(
(filtroViewModel.StatusSelected == 3) ||
(filtroViewModel.StatusSelected == 1 && x.Id_Log == 0) ||
(filtroViewModel.StatusSelected == 2 && x.Id_Log > 0)
);
return f;
}
private Func<MovimentoTratamento, bool> FiltroNotaFiscal(FiltroViewModel filtroViewModel)
{
return x => (string.IsNullOrEmpty(filtroViewModel.NotaFiscal) || x.Nr_Nota_Fiscal == filtroViewModel.NotaFiscal);
}
public IQueryable<MovimentoTratamento> Filter()
{
Func<Tratamento, bool> filter = FiltroPadrao(vm);
Func<MovimentoTratamento, bool> mov = FiltroNotaFiscal(vm);
UnirExpressionMovimento(filter, mov);
return repo.Get(f);
}
private Func<MovimentoTratamento, bool> UnirExpressionMovimento(Func<Tratamento, bool> filter, Func<MovimentoTratamento, bool> mov)
{
Func<MovimentoTratamento, bool> f = value => filter((Tratamento)value);
return value => f(value) && mov(value);
}