クラスを想像してみましょIList<T>
うIQueryable<T>
。
そのクラスにはint TotalItems
プロパティがあり、(それほど驚くべきことではありませんが) クエリ可能または列挙可能なパラメーターの数を取得/設定します。
IEnumerable<T>
パラメータとして使用すると、
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
Count()
メソッドは (私が間違っていなければ、それがポイントです)になりEnumerable.Count()
ます。したがって、クエリがIQueryable<T>
(から継承するIEnumerable<T>
) であっても、列挙されます (これは明らかに「db クエリ」では望ましくありません)。
Queryable.Count()
myIEnumerable<T>
が実際に である場合にメソッドを使用する方法はありますIQueryable<T>
か、またはこの場合、たとえば 2 ctor を使用して設計を変更する必要がありますか?
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
public Pagination(IQueryable<T> query)
{
TotalItems = query.Count();
}
EDITIQueryable<T>
から継承することは、同じ名前の拡張メソッドがあるという事実とIEnumerable<T>
は何の関係もないこと、そして「同じように見える」拡張メソッドに同じ名前を付けるのはいいことだと理解していますが、それでも私はそれだと思い
ます時々混乱する...IEnumerable<T>
IQueryable<T>
好奇心のための一般的な質問
それらは、同じ「アーキテクチャ」を持つフレームワークの他の例ですか:継承+拡張メソッドの共通名?