1

例如,我有一种表达方式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
}
4

1 回答 1

0

如果您不打算使用谓词构建器,则应该使用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>

编辑:添加了第一个扩展(我认为没有必要)

于 2016-12-10T21:50:16.860 回答