使用带有实体框架的PredicateBuilder进行Stackoverflow异常

时间:2018-03-13 07:05:22

标签: entity-framework predicatebuilder

我有Predicate构建器,它具有谓词和内部谓词,并根据条件构建动态过滤器,假设我选择了一个部门,在该部门下我获得了员工列表,一旦我获得了员工列表,我需要为属于所选部门的每个员工加载相应的记录。

实施已经很久了,如果部门没有太多员工,它可以正常工作,一旦超过500或1000,谓词构建器就会导致堆栈溢出。请参阅我的代码片段 - 我正在使用.net framework 4.5.2。

使用in循环在此行分配内部谓词时获取stackoverflow异常,当记录超过1000或500时,它将根据员工记录进行循环。

Expression<Func<EmployeeTable, bool>> predicate =  PredicateBuilder.True<EmployeeTable>();
var innerPredicate = PredicateBuilder.False<EmployeeTable>();

case FilterBy.EmployeeName:
    if (!isEmpNameFilterExists)
    {
        foreach (string empName in item.FieldCollection)
        {
            innerPredicate = innerPredicate.Or(x => x.Name.Equals(empName, 
                                       StringComparison.OrdinalIgnoreCase));
        }
        predicate = predicate.And(innerPredicate.Expand());
    }
    break;

2 个答案:

答案 0 :(得分:0)

这可能是由于.NET应用程序(https://stackoverflow.com/a/823729/2298807)的(通常是足够的)但很小的堆栈而发生的。对谓词的评估通常作为lamda函数的一部分完成,并且它们使用堆栈。我现在没有详细的谓词库,但我假设使用递归函数。

无论如何:我建议通过构建包含名称的BreadCrumbBar来使用Contains

List<string>

注意:请检查语法,因为我目前没有可用的VS环境。

答案 1 :(得分:0)

我添加了自己的表达式构建器引擎,即生成谓词的更好方法。 PredicateBuilder适用于LINQ to Object,使EntityFramework有问题,因为它生成具有完整模型命名空间的Lambda方法,并继续添加多个搜索条件。我觉得它在Entity框架中有大量过滤器的限制。在我的情况下,我将728计数传递给Model的一个字段,它打破了Stack溢出异常。 728 lambdas方法将添加到具有完整特定NAMESPACES的堆栈。

自定义表达在我的情况下完全正常。请在下面找到相同的源代码。

var entityType = typeof(Emptable); var parameter = Expression.Parameter(entityType,&#34; a&#34;); var containsMethod = typeof(string).GetMethod(&#34; Equals&#34;,new [] {typeof(string)}); //切换EmployeeName过滤器的语句。 case FilterBy.EmployeeName:     if(!isEmpNameFilterExists)         {
        var propertyExpression = Expression.Property(参数,&#34; EmployeeName&#34;);             foreach(item.FieldCollection中的字符串empName)             {               var innerExpression = Expression.Call(propertyExpression,containsMethod,Expression.Constant(empName));           body = Expression.OrElse(body,innerExpression);              }          } 打破;