Toutes les excuses si cela est couvert dans d'autres réponses. J'ai cherché toute la nuit et je suis passé par une centaine d'autres solutions, mais je n'arrivais pas à assembler les pièces du puzzle. J'ai expérimenté avec LinqPad, PredicateBuilder, ExpressionVisitors, etc. mais je me gratte toujours la tête.Génération d'une expression <Func <TEntity, bool >> pour l'expression multiniveau
Je suis en train de mettre en œuvre quelque chose un peu plus compliqué que cela, mais ce code montre la question:
public Expression<Func<TEntity, bool>> GeneratorEqualityTest<TProperty>(Expression<Func<TEntity, TProperty>> accessor, int expectedValue) {
// Help
var argument = Expression.Parameter(typeof(TEntity));
var accessorArgument = Expression.Property(argument, accessor.ToPropertyName());
// Help
Predicate = Expression.Lambda<Func<TEntity, bool>>(Expression.Equal(accessorArgument, Expression.Constant(expectedValue)), argument);
}
Cela fonctionne bien quand est quelque chose comme accesseur ceci: x => x.Value
Mais pas avec x => x.Complex.Value
ou x => x.Complex.MoreComplex.Value
J'essaie d'analyser des expressions à partir de chaînes telles que> = 5 ou (5 ... 10) et de générer des expressions que je peux insérer dans la clause Where d'une requête LINQ-EF (et g et traduit en T-SQL). Cela fonctionne bien pour le cas à un seul niveau, mais je ne peux pas comprendre comment marcher l'expression.
Dans EF, x.Complex.MoreComplex.Value correspond aux jointures SQL. Les points de bonus s'il est possible de convertir l'accesseur en quelque chose que je peux passer dans une Include()
déclaration
Je mets un exemple de projet sur Github: https://github.com/scottt732/ExpressionHelp
Ne devrait-il pas être 'TProperty expectedValue' au lieu de' int'? –