Я пытаюсь создать выражение:
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)}
Я не могу изменить структуру выражения, поскольку он уже используется несколько раз в проекте.