在 LINQ 表达式 Linqkit 中检测到循环
A cycle was detected in a LINQ expression Linqkit
我有一个表达式,例如x=>x.Id
;
我有一个函数,需要组合两个表达式。我用 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
}
如果您不打算使用 Predicate 构建器,您应该使用 Expand
以创建带有扩展子表达式的副本
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>>();
它有点难看,所以,如果可以的话,请按照建议使用 PredicateBuilder
(它隐式转换为 Expression<TDelegate>
)
编辑: 添加了第一个扩展(我认为没有必要)
我有一个表达式,例如x=>x.Id
;
我有一个函数,需要组合两个表达式。我用 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
}
如果您不打算使用 Predicate 构建器,您应该使用 Expand
以创建带有扩展子表达式的副本
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>>();
它有点难看,所以,如果可以的话,请按照建议使用 PredicateBuilder
(它隐式转换为 Expression<TDelegate>
)
编辑: 添加了第一个扩展(我认为没有必要)