存储库方法中的类型推断

本文关键字:类型 方法 存储 | 更新日期: 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的类型是什么),例如