连接谓词的默认值作为方法参数

Default Value for Join Predicate as Method Parameter

我有一个选择数据的方法。如果调用者可以提供一个谓词来修改 .Where(),它可以支持多个用例。我尝试了类似

private class ABJoin
{
    public A A { get; set; }
    public B B { get; set; }
}

bool NoFilter(ABJoin join, int index)
{
    return true; // Don't filter at all for this
}

private IEnumerable<TResult> GetData
(Func<ABJoin, int, bool> filter)
{
    var query = ctx.TypeA
        .Join(ctx.TypeB, a => a.BId, b => b.Id, 
              (a, b) => new ABJoin() { A = a, B = b })
    // etc.
}

到目前为止效果很好。

然而,一些用例不需要提供任何过滤器(真实版本有其他参数来区分每个用例的行为)。我认为为过滤器参数提供默认值会很方便

private IEnumerable<TResult> GetData
(Func<ABJoin, int, bool> filter = NoFilter)

但是,那不编译。错误指出 NoFilter 必须是编译时常量。

有没有办法在 GetData() 中为 filter 提供默认值?

提供 null 的默认值并在方法内将其与真实委托交换:

private IEnumerable<TResult> GetData(Func<ABJoin, int, bool> filter = null)
{
    filter = filter ?? ((a,b) => true);
}