存储库方法中的类型推断
本文关键字:类型 方法 存储 | 更新日期: 2023-09-27 18:04:03
我有一个RepositoryBase类,我在其中为我的实体框架上下文定义了基本的crud方法。我有两个All()方法的重载:
public virtual IQueryable<T> All<TKey>(Expression<Func<T, bool>> predicate)
{
return All().Where(predicate);
}
public virtual PagedResult<T> All<TKey>(int startRowIndex, int maximumRows,
Expression<Func<T, TKey>> orderingKey, Expression<Func<T, bool>> predicate,
bool sortDescending = false)
{
var subset = All().Where(predicate);
IEnumerable<T> result = sortDescending
? subset.OrderByDescending(orderingKey).Skip(startRowIndex).Take(maximumRows)
: subset.OrderBy(orderingKey).Skip(startRowIndex).Take(maximumRows);
//More code ommited
}
第一个方法总是需要我显式地指定实体类型,而第二个方法则不需要。为什么会这样?
示例:
return All(s => s.LoanApplicationId == loanApplicationId)
我必须这样称呼它:
return All<LoanApplication>(s => s.LoanApplicationId == loanApplicationId)
但这确实编译:
return All(0,10, s => s.Name, s => s.LoanApplicationId == loanApplicationId, false)
TKey
在第二个(通过Expression<Func<T, TKey>> orderingKey
)的参数列表中,而不是第一个。当您将其与所提供的参数(s => s.Name
)一起使用时,这足以为第二种方法成功推断类型。在第一个版本中,您没有给自己这样的奢侈,因此编译器强制您通过显式地提供类型参数来填充详细信息。
从它的外观来看,无论如何您都不需要第一个TKey
,因此可能会摆脱它(除非有比相对简单的实现更多的可见代码)。我认为它的意思和你的示例调用的意思不一样。第二个中的TKey
很可能是string
(无论s.Name
的类型是什么),例如