1

我有一个 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)
4

1 回答 1

2

TKey在第二个(via Expression<Func<T, TKey>> orderingKey)的参数列表中,而不是第一个。当您将其与您提供的参数 ( s => s.Name) 一起使用时,这足以让第二个成功推断出类型。在第一个版本中您不会给自己那么奢侈,因此编译器会强制您通过显式提供类型参数来填写详细信息。

而且从它的外观来看,无论如何你都不需要TKey,所以可能会摆脱它(除非有比那个相对简单的实现更多的代码可见)。而且我认为这并不意味着您的示例调用认为它意味着什么。TKey例如,第二个很可能string(无论是什么类型s.Name)。

于 2013-03-15T02:52:54.310 回答