1

Entity Framework Context の基本的な crud メソッドを定義する RepositoryBase クラスがあります。All() メソッドの次の 2 つのオーバーロードがあります。

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
}

最初の方法では常にエンティティ タイプを明示的に指定する必要がありますが、2 番目の方法では必要ありません。どうしてこれなの?

例、これはコンパイルされません:

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は、最初のものではなく、2 番目の ( 経由でExpression<Func<T, TKey>> orderingKey) パラメータ リストにあります。これは、指定された引数 ( ) と共に使用するときに、2 番目の型を正常に推論するのに十分な量を提供しますs => s.Name。最初のバージョンではそのような余裕はありません。そのため、コンパイラは型パラメーターを明示的に指定して詳細を入力するよう強制します。

そして、見た目からすると、とにかく最初は必要ないTKeyので、おそらくそれを取り除くことができます (その比較的単純な実装よりも多くのコードが表示される場合を除きます)。そして、それがあなたのサンプル呼び出しがそれを意味すると考えていることを意味するとは思いません。TKeyたとえば、2番目の可能性がありますstring(タイプが何であれs.Name)。

于 2013-03-15T02:52:54.310 に答える