EFObjectContext
を使用すると、連続した選択肢と同じシグニチャを持つ2つの異なる拡張メソッドが表示されます。どちらを選んだかに基づいて、どちらか一方が呼び出されるような魔法があるのは私には意味がありません。実際に何が起こっているのでしょうか。
1 に答える
私はそれが?Campaigns
のインスタンスだと思います を継承します。これは、を実装します。その定義は次のとおりです。DbSet<Campaign>
DbSet
DbQuery
IOrderedQueryable
public interface IOrderedQueryable<out T> : IQueryable<T>,
IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable
ご覧のとおり、とは両方ともIQueryable<T>
実装IEnumerable<T>
されていますが、の定義はIQueryable
それが拡張されていることを示していますIEnumerable
。
public interface IQueryable : IEnumerable
したがって、基本的に、拡張メソッドはに実装されますが、元のインターフェイスを拡張するためIEnumerable
、からも使用できます。IQueryable
暗黙的または明示的に型をにキャストする可能性があるため、Intellisenseはこれらのオプションの両方を選択していますIEnumerable
。
実際に実行されるメソッドは、呼び出されるタイプによって異なります。たとえば、メソッドのCampaigns
インスタンスでDbSet<Campaign>
は(MS SQLを使用している場合)クエリに変換されSELECT TOP 1...
ますが、で呼び出すとCampaigns.ToList()
、つまりIEnumerable
、ゼロインデックスでアイテムが返されます。拡張メソッドの実装は、タイプごとに異なります。
それが理にかなっていることを願っています:)