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 对不变性和链接,但这绝对是不寻常的。)