我有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;
答案 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);
}
}
打破;