2016-12-10 12 views
1

私は1つの式、たとえばx=>x.Idを持っています。LINQ式でサイクルが検出されましたLinqkit

私は2つの式を結合する必要がある関数を持っています。私はLinqkitを使用します。

マイモデル:私は私の実体をソートする必要が私のリポジトリにそれを渡したいたより

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; 
} 

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

Linqkitの 'PredicateBuilder'を使用してください。今度は 'Func'を使って作業します。 –

答えて

0

あなたは述語ビルダーを使用しない場合は、拡張されたサブ表現でコピーを作成するために

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>>(); 

Expandを使用する必要がありますそれはとても少し醜いですが、提案どおり場合PredicateBuilderを使用(私は必要ないと思った)を追加しました最初の拡張

:でき

編集(それはExpression<TDelegate>にキャスト暗黙的にしています)

+0

申し訳ありませんが、今私はそれを持っています:タイプ 'System.Linq.Expressions.PropertyExpression'のオブジェクトを 'System.Linq.Expressions.LambdaExpression'とタイプすることができません。この行の中で:input.Expr = exp.Expand >(); – jack

+0

この場合はどうなりますか? 'expandedInput = input.Expr.Expand >();' 'var exp = x => expandedInput.Invoke(x)&& x.Name.Contains(" A ");' 'input.Expr = exp.Expand >(); ' –

+0

はい、動作します! – jack

関連する問題