Where Dynamic in Linq to Entities

1

Expensive,

I need to do a dynamic where in a Linq to Entities. I researched some solutions but none could get what I need. Until then, I have the following switch:

    public TransportadorasGrid ObterTransportadorasBusca(Int32 PageNumber, Int32 PageSize, String NomeTransportadora, Boolean Status, Guid cdUsuario, String Idioma)
    {
        TransportadorasGrid Grid = new TransportadorasGrid();
        List<Transportadora> Transp = new List<Transportadora>();
        Int32 idLoja = Identidade.ObterIdLoja(cdUsuario);

        try
        {
            using (IFEcommerce ctx = new IFEcommerce())
            {
                BaseEcommerce.Definir(ctx);
                ctx.Configuration.ProxyCreationEnabled = false;

                Int32 StartLine = PageNumber * PageSize;

                Expression<Func<vw_Painel_FretesLoja_GridTransportadoras, object>> ExpressionOrdenacao;
                String NomeColunaBusca = String.Empty;

                switch (Idioma)
                {
                    case "en-US":
                        ExpressionOrdenacao = p => p.Label_Nome_EN;
                        NomeColunaBusca = "Label_Nome_EN";
                        break;
                    case "es-ES":
                        ExpressionOrdenacao = p => p.Label_Nome_ES;
                        NomeColunaBusca = "Label_Nome_ES";
                        break;
                    case "fr-FR":
                        ExpressionOrdenacao = p => p.Label_Nome_FR;
                        NomeColunaBusca = "Label_Nome_FR";
                        break;
                    case "de-DE":
                        ExpressionOrdenacao = p => p.Label_Nome_DE;
                        NomeColunaBusca = "Label_Nome_DE";
                        break;
                    case "it-IT":
                        ExpressionOrdenacao = p => p.Label_Nome_IT;
                        NomeColunaBusca = "Label_Nome_IT";
                        break;
                    default:
                        ExpressionOrdenacao = p => p.Label_Nome_PT;
                        NomeColunaBusca = "Label_Nome_PT";
                        break;
                }


                //Eu coloquei o NomeProp no where Somente para exemplificar...
                List<vw_Painel_FretesLoja_GridTransportadoras> tr = ctx.vw_Painel_FretesLoja_GridTransportadoras
                    .Where(u => u.idLoja == idLoja && u.flExcluido == false && NomeProp == NomeTransportadora)
                    .OrderBy(ExpressionOrdenacao)
                    .Skip(StartLine)
                    .Take(PageSize)
                    .ToList();

                List<tb_Param_TipoAcrescimoDesconto> AcoesAcDesc = ctx
                    .tb_Param_TipoAcrescimoDesconto
                    .ToList();

                List<ParametroAcrescimoDesconto> Acoes = ObterParametrosAcrescimoDesconto(cdUsuario);

                foreach (vw_Painel_FretesLoja_GridTransportadoras trnsp in tr)
                {
                    Transportadora t = new Transportadora();

                    tb_Param_TipoAcrescimoDesconto Frete = AcoesAcDesc.FirstOrDefault(a => a.idTipoDescontoAcrescimo == trnsp.idTipoDescontoAcrescimoFrete);
                    tb_Param_TipoAcrescimoDesconto Pedido = AcoesAcDesc.FirstOrDefault(a => a.idTipoDescontoAcrescimo == trnsp.idTipoDescontoAcrescimoPedido);

                    t.AcaoFrete = Acoes.FirstOrDefault(a => a.CodigoParametro == Frete.cdTipoDescontoAcrescimo);
                    t.AcaoPedido = Acoes.FirstOrDefault(a => a.CodigoParametro == Pedido.cdTipoDescontoAcrescimo); 
                    t.CodigoTransportadora = trnsp.cdTransportadora;
                    t.LabelInformacoes = trnsp.lbInformacoes;
                    t.LabelNomeExibicao = trnsp.lbNomeExibicao;
                    t.Traducoes = new List<TraducoesLabel>();
                    t.ValorFrete = trnsp.vlDescontoAcrescimoFrete;
                    t.ValorPedido = trnsp.vlDescontoAcrescimoPedido;
                    t.Status = trnsp.flStatus;

                    Transp.Add(t);
                }

                Grid.Transportadoras = Transp;

                Int32 Count = ctx.vw_Painel_FretesLoja_GridTransportadoras.Count(u => u.idLoja == idLoja && u.flExcluido == false);

                Grid.Count = Count;
            }
        }
        catch (Exception Exc)
        {
            ExceptionDispatchInfo.Capture(Exc).Throw();
        }

        return Grid;
    }

So far, okay. But I need to use the filter selected by the switch to filter. (I put the NameProp in the where only to exemplify)

List<vw_Painel_FretesLoja_GridTransportadoras> tr = ctx.vw_Painel_FretesLoja_GridTransportadoras
    .Where(u => u.idLoja == idLoja && u.flExcluido == false && NomeProp == NomeTransportadora)
    .OrderBy(ExpressionOrdenacao)
    .Skip(StartLine)
    .Take(PageSize)
    .ToList();

I tried to use the code below, but apparently it only works with LINQ to objects.

List<vw_Painel_FretesLoja_GridTransportadoras> tr = ctx.vw_Painel_FretesLoja_GridTransportadoras
    .Where(u => u.idLoja == idLoja && u.flExcluido == false && u.GetType().GetProperty(NomeProp).GetValue(u, null) == NomeTransportadora)
    .OrderBy(ExpressionOrdenacao)
    .Skip(StartLine)
    .Take(PageSize)
    .ToList();

Any light?

    
asked by anonymous 06.09.2017 / 22:23

1 answer

1

Also use a expression to define the filter for this search and that is related to the ordering example :

public TransportadorasGrid ObterTransportadorasBusca(Int32 PageNumber, Int32 PageSize, String NomeTransportadora, Boolean Status, Guid cdUsuario, String Idioma)
{
    TransportadorasGrid Grid = new TransportadorasGrid();
    List<Transportadora> Transp = new List<Transportadora>();
    Int32 idLoja = Identidade.ObterIdLoja(cdUsuario);

    try
    {
        using (IFEcommerce ctx = new IFEcommerce())
        {
            BaseEcommerce.Definir(ctx);
            ctx.Configuration.ProxyCreationEnabled = false;

            Int32 StartLine = PageNumber * PageSize;

            Func<vw_Painel_FretesLoja_GridTransportadoras, object> ExpressionOrdenacao;
            Func<vw_Painel_FretesLoja_GridTransportadoras, bool> ExpressionWhere;
            String NomeColunaBusca = String.Empty;

            switch (Idioma)
            {
                case "en-US":
                    ExpressionOrdenacao = p => p.Label_Nome_EN;
                    ExpressionWhere = c => c.idLoja == idLoja && c.flExcluido == false && c.Label_Nome_EN == NomeTransportadora                 
                    break;
                case "es-ES":
                    ExpressionOrdenacao = p => p.Label_Nome_ES;
                    ExpressionWhere = c => c.idLoja == idLoja && c.flExcluido == false && c.Label_Nome_ES == NomeTransportadora                 
                    break;
                case "fr-FR":
                    ExpressionOrdenacao = p => p.Label_Nome_FR;
                    ExpressionWhere = c => c.idLoja == idLoja && c.flExcluido == false && c.Label_Nome_FR == NomeTransportadora                     
                    break;
                case "de-DE":
                    ExpressionOrdenacao = p => p.Label_Nome_DE;
                    ExpressionWhere = c => c.idLoja == idLoja && c.flExcluido == false && c.Label_Nome_DE == NomeTransportadora                     
                    break;
                case "it-IT":
                    ExpressionOrdenacao = p => p.Label_Nome_IT;
                    ExpressionWhere = c => c.idLoja == idLoja && c.flExcluido == false && c.Label_Nome_IT == NomeTransportadora                     
                    break;
                default:
                    ExpressionOrdenacao = p => p.Label_Nome_PT;
                    ExpressionWhere = c => c.idLoja == idLoja && c.flExcluido == false && c.Label_Nome_PT == NomeTransportadora                     
                    break;
            }


            //Eu coloquei o NomeProp no where Somente para exemplificar...
            List<vw_Painel_FretesLoja_GridTransportadoras> tr = ctx.vw_Painel_FretesLoja_GridTransportadoras
                .Where(ExpressionWhere)
                .OrderBy(ExpressionOrdenacao)
                .Skip(StartLine)
                .Take(PageSize)
                .ToList();

            List<tb_Param_TipoAcrescimoDesconto> AcoesAcDesc = ctx
                .tb_Param_TipoAcrescimoDesconto
                .ToList();

            List<ParametroAcrescimoDesconto> Acoes = ObterParametrosAcrescimoDesconto(cdUsuario);

            foreach (vw_Painel_FretesLoja_GridTransportadoras trnsp in tr)
            {
                Transportadora t = new Transportadora();

                tb_Param_TipoAcrescimoDesconto Frete = AcoesAcDesc.FirstOrDefault(a => a.idTipoDescontoAcrescimo == trnsp.idTipoDescontoAcrescimoFrete);
                tb_Param_TipoAcrescimoDesconto Pedido = AcoesAcDesc.FirstOrDefault(a => a.idTipoDescontoAcrescimo == trnsp.idTipoDescontoAcrescimoPedido);

                t.AcaoFrete = Acoes.FirstOrDefault(a => a.CodigoParametro == Frete.cdTipoDescontoAcrescimo);
                t.AcaoPedido = Acoes.FirstOrDefault(a => a.CodigoParametro == Pedido.cdTipoDescontoAcrescimo); 
                t.CodigoTransportadora = trnsp.cdTransportadora;
                t.LabelInformacoes = trnsp.lbInformacoes;
                t.LabelNomeExibicao = trnsp.lbNomeExibicao;
                t.Traducoes = new List<TraducoesLabel>();
                t.ValorFrete = trnsp.vlDescontoAcrescimoFrete;
                t.ValorPedido = trnsp.vlDescontoAcrescimoPedido;
                t.Status = trnsp.flStatus;

                Transp.Add(t);
            }

            Grid.Transportadoras = Transp;

            Int32 Count = ctx.vw_Painel_FretesLoja_GridTransportadoras.Count(u => u.idLoja == idLoja && u.flExcluido == false);

            Grid.Count = Count;
        }
    }
    catch (Exception Exc)
    {
        ExceptionDispatchInfo.Capture(Exc).Throw();
    }

    return Grid;
}

06.09.2017 / 23:01