C# - 向 func 添加条件导致堆栈溢出异常
C# - Adding condition to func results in stack overflow exception
我有一个 func 作为规范的一部分 class 它对给定的 iqueryable
进行排序
Func<IQueryable<T>, IOrderedQueryable<T>>? Sort { get; set; }
当我像下面这样向 func 添加多个条件时,会导致堆栈溢出异常。
spec.OrderBy(sc => sc.Case.EndTime).OrderBy(sc => sc.Case.StartTime);
OrderBy方法是这样实现的
public ISpecification<T> OrderBy<TProperty>(Expression<Func<T, TProperty>> property)
{
_ = Sort == null ? Sort = items => items.OrderBy(property) : Sort = items => Sort(items).ThenBy(property);
return this;
}
链接或使用单独的行没有区别。
如果我分配一个规范的新实例并将其设置为 func,这个问题就会得到解决,但我不想每次都分配给一个新实例。请建议我在这里遗漏了什么以及如何重用同一实例(如果可能)。
这是有问题的部分:
Sort = items => Sort(items)
这就像编写一个调用自身的方法。
您想要的是评估现有的 Sort
函数,而不是“[=12=的结果” ] 属性 评估时。
我会这样重写方法:
public ISpecification<T> OrderBy<TProperty>(Expression<Func<T, TProperty>> property)
{
var existingSort = Sort;
Sort = existingSort is null
? items => items.OrderBy(property)
: items => existingSort(items).ThenBy(property);
return this;
}
(我也赞同 D-Shih 的评论 - 这是一种有点 counter-intuitive 的方法,并且与正常的 LINQ 背道而驰。也许您有一些特殊的理由反对 LINQ 对不变性和链接,但这绝对是不寻常的。)
我有一个 func 作为规范的一部分 class 它对给定的 iqueryable
进行排序Func<IQueryable<T>, IOrderedQueryable<T>>? Sort { get; set; }
当我像下面这样向 func 添加多个条件时,会导致堆栈溢出异常。
spec.OrderBy(sc => sc.Case.EndTime).OrderBy(sc => sc.Case.StartTime);
OrderBy方法是这样实现的
public ISpecification<T> OrderBy<TProperty>(Expression<Func<T, TProperty>> property)
{
_ = Sort == null ? Sort = items => items.OrderBy(property) : Sort = items => Sort(items).ThenBy(property);
return this;
}
链接或使用单独的行没有区别。
如果我分配一个规范的新实例并将其设置为 func,这个问题就会得到解决,但我不想每次都分配给一个新实例。请建议我在这里遗漏了什么以及如何重用同一实例(如果可能)。
这是有问题的部分:
Sort = items => Sort(items)
这就像编写一个调用自身的方法。
您想要的是评估现有的 Sort
函数,而不是“[=12=的结果” ] 属性 评估时。
我会这样重写方法:
public ISpecification<T> OrderBy<TProperty>(Expression<Func<T, TProperty>> property)
{
var existingSort = Sort;
Sort = existingSort is null
? items => items.OrderBy(property)
: items => existingSort(items).ThenBy(property);
return this;
}
(我也赞同 D-Shih 的评论 - 这是一种有点 counter-intuitive 的方法,并且与正常的 LINQ 背道而驰。也许您有一些特殊的理由反对 LINQ 对不变性和链接,但这绝对是不寻常的。)