2016-12-10 1 views
1

J'ai une expression, par exemple x=>x.Id;Un cycle a été détecté dans une expression LINQ Linqkit

Et j'ai une fonction, où j'ai besoin de combiner deux expressions. J'utilise Linqkit.

Mon modèle:

public class Model{ 
    Expression<Func<Entity,bool>> Expr {get;set;} 
} 

public Model Combine(Model input) 
{ 
    var exp = x => input.Expr.Invoke(x) && x.Name.Contains("A"); 
    input.Expr = exp; 
    input.Expr.Compile(); 
    return input; 
} 

Que je veux passer dans mon dépôt, où je dois trier mon entité.

public Ienumerable<Entity> Get(Model model) 
{ 
    var entity = _context.Entity.Where(model.Expr).ToList(); // there A cycle was detected in a LINQ expression exception 
} 
+0

Vous devriez utiliser 'PredicateBuilder' de Linqkit pour cela. Maintenant, vous travaillez avec 'Func's. –

Répondre

0

Si vous ne comptez pas utiliser constructeur prédicats, vous devez utiliser Expand afin de créer une copie avec des expressions sous étendues

var expandedInput = input.Expr.Expand<Func<Entity,bool>>(); 
var exp = x => expandedInput.Invoke(x) && x.Name.Contains("A"); 
input.Expr = exp.Expand<Func<Entity,bool>>(); 

Il est un peu laid, utilisez PredicateBuilder comme suggéré si vous peut (il a un jeté à implicitement Expression<TDelegate>)

Edit: première expansion Ajouté (que je pensais était pas nécessaire)

+0

désolé, mais maintenant j'ai cela: Impossible de lancer l'objet de type 'System.Linq.Expressions.PropertyExpression' pour taper 'System.Linq.Expressions.LambdaExpression'. dans cette ligne: input.Expr = exp.Expand >(); – jack

+0

Qu'est-ce que vous obtenez dans ce cas? 'var expandedInput = entrée.Expr.Expand >();' 'var exp = x => expandedInput.Invoke (x) && x.Nom.Contient (" A ");' 'input.Expr = exp.Expand >(); ' –

+0

Oui, ça marche! – jack