【问题标题】:A cycle was detected in a LINQ expression Linqkit在 LINQ 表达式 Linqkit 中检测到循环
【发布时间】:2017-04-26 02:49:28
【问题描述】:

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

【问题讨论】:

  • 你应该使用 Linqkit 的 PredicateBuilder 来做这个。现在您与Funcs 合作。

标签: c# asp.net-mvc linq linqkit


【解决方案1】:

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

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

【讨论】:

  • 抱歉,但现在我知道了:无法将“System.Linq.Expressions.PropertyExpression”类型的对象转换为“System.Linq.Expressions.LambdaExpression”类型。在这一行: input.Expr = exp.Expand>();
  • 在这种情况下你会得到什么? var expandedInput = input.Expr.Expand&lt;Func&lt;Entity,bool&gt;&gt;();var exp = x =&gt; expandedInput.Invoke(x) &amp;&amp; x.Name.Contains("A");input.Expr = exp.Expand&lt;Func&lt;Entity,bool&gt;&gt;();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
相关资源
最近更新 更多