表达式<Func<>>[]不使用参数有什么等价的?
What's the equivalent to not using params with Expression<Func<>>[]?
我在存储库基础 class 中有一些代码用于 Entity Framework 急切加载导航属性:
public virtual List<T> Find(Func<T, bool> where, params Expression<Func<T, object>>[] navigationProperties)
{
//blah biddy blah blah
}
那么在调用上面的方法时:
var beers = BeerRepository.Find(x => x.Type == "IPA", a => a.Ingredients, b => b.Sizes, c => c.Hangovers);
效果很好。我知道在调用方法时使用 "params" 提供了一个很棒的神奇快捷方式,我已经看到了一些简单的例子,说明没有它需要什么。
但是,当我从签名中删除参数时,我无法弄清楚如何调用上面的方法。
有什么想法吗?
不确定我是否理解你的问题。
你可以打电话给
beerRepository.Find((x => x.Type == "IPA")
然后在 Find() 中,您会看到导航属性数组将为空。
泛型方法是一种方法模板。如果你提供一个类型参数,它就会变成一个具体的、类型化的方法。你的方法(没有params
)...
public virtual List<T> Find<T>(Func<T, bool> where,
Expression<Func<T, object>>[] navigationProperties)
...在 BeerRepository
中会变成类似...
public virtual List<Beer> Find(Func<Beer, bool> where,
Expression<Func<Beer, object>>[] navigationProperties)
...这清楚地表明您必须提供一个 Expression<Func<Beer, object>>[]
数组。构建它需要更笨重的代码,因为您无法利用类型推断:
var navProps = new Expression<Func<Beer, object>>[]
{
a => a.Ingredients,
a => a.Sizes,
a => a.Hangovers
});
我在存储库基础 class 中有一些代码用于 Entity Framework 急切加载导航属性:
public virtual List<T> Find(Func<T, bool> where, params Expression<Func<T, object>>[] navigationProperties)
{
//blah biddy blah blah
}
那么在调用上面的方法时:
var beers = BeerRepository.Find(x => x.Type == "IPA", a => a.Ingredients, b => b.Sizes, c => c.Hangovers);
效果很好。我知道在调用方法时使用 "params" 提供了一个很棒的神奇快捷方式,我已经看到了一些简单的例子,说明没有它需要什么。
但是,当我从签名中删除参数时,我无法弄清楚如何调用上面的方法。
有什么想法吗?
不确定我是否理解你的问题。
你可以打电话给
beerRepository.Find((x => x.Type == "IPA")
然后在 Find() 中,您会看到导航属性数组将为空。
泛型方法是一种方法模板。如果你提供一个类型参数,它就会变成一个具体的、类型化的方法。你的方法(没有params
)...
public virtual List<T> Find<T>(Func<T, bool> where,
Expression<Func<T, object>>[] navigationProperties)
...在 BeerRepository
中会变成类似...
public virtual List<Beer> Find(Func<Beer, bool> where,
Expression<Func<Beer, object>>[] navigationProperties)
...这清楚地表明您必须提供一个 Expression<Func<Beer, object>>[]
数组。构建它需要更笨重的代码,因为您无法利用类型推断:
var navProps = new Expression<Func<Beer, object>>[]
{
a => a.Ingredients,
a => a.Sizes,
a => a.Hangovers
});