连接谓词的默认值作为方法参数
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);
}
我有一个选择数据的方法。如果调用者可以提供一个谓词来修改 .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);
}