Я не могу динамически создать лямбда-выражение - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь создать выражение:

Expression<Func<Zone, bool>> predicado;

public class Zone:Entity
    {

        [Required]
        [StringLength(20)]
        public string Name { get; set; }

        public Zone()
        {
        }

        public Zone(int id, string name)
        {
            Id = id;
            Name = name;
        }


    }

Мой класс отвечает за генерацию дианмически:

public class Filtro<T>
    {
        public static Expression<Func<Zone, bool>> FiltroDinamico(T model, string nomeProp, object valor, TipoFiltro tipo)
        {
            Expression<Func<Zone, bool>> predicado;
            ParameterExpression pExpr = Expression.Parameter(model.GetType(), "o");

            // Controi propriedades aninhadas
            string[] propsAninhadas = nomeProp.Split('.');
            Expression mbr = pExpr;

            // percorre as propriedades aninhadas, ex.: Cliente.PedidoVenda.Valor
            for (int i = 0; i < propsAninhadas.Length; i++)
                mbr = Expression.PropertyOrField(mbr, propsAninhadas[i]);

            // cria predicados de comparação
            switch (tipo)
            {
                case TipoFiltro.MaiorOuIgual:
                    predicado = null;
                    break;
                case TipoFiltro.Maior:
                    predicado = null;
                    break;
                case TipoFiltro.MenorOuIgual:
                    predicado = null;
                    break;
                case TipoFiltro.Menor:
                    predicado = null;
                    break;
                default:
                    // igualdade como padrão
                    // cria predicado de comparação de igualdade
                    predicado = pExpr => mbr == valor;
                    break;
            }

            return predicado;
        }

        // filtro de comparação
        public enum TipoFiltro
        {
            Igualdade,
            MaiorOuIgual,
            Maior,
            MenorOuIgual,
            Menor,
            Contem,
            IniciaCom,
            TerminaCom
        }


    }

До обратной строки все кажется все идет хорошо, но в последнем назначении что-то происходит, и выражение теряется.

Пример вызова может быть следующим:

where = Filtro<Zone>.FiltroDinamico(new Zone(), "Name", "myName", Filtro<Zone>.TipoFiltro.Igualdade);

Ожидаемое значение будет примерно таким:

o => o.Name == "myName"

Выражение возвращается следующим образом:

Forexado = {pExpr => (значение (ControlTe c .Utils.Filtro 1+<>c__DisplayClass0_0[ControlTec.Models.Zone]).mbr == value(ControlTec.Utils.Filtro 1 + <> c__DisplayClass0_0 [ControlTe c .Models.Zone]). Valor)}

Я не могу изменить структуру выражения, поскольку он уже используется несколько раз в проекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...