DbSet<T>
共変であることはできません。まず、これは、C# では、クラスは共変ではなく、インターフェイスのみであるためです。DbSet<T>
第二に、共変法と反変法の両方があるためです。
次の 2 つの例を見てみましょう。
DbSet<CategoryType> set = context.Set<CategoryType>();
IQueryable<IItemType> query = set.Where(x => x.Foo == Bar);
したがって、すべてCategoryType
の s がIItemType
であることがわかっているため、これは常に機能することがわかっています。
しかし逆にこれを試してみてください...
DbSet<CategoryType> set = context.Set<CategoryType>();
IItemType newItemType = new ProductType();
set.Add(newItemType); // Compiler error.
すべてIItemType
がであるわけではありませんCategoryType
。したがって、キャストできると、追加時に実行時エラーが発生します...コンパイラは、これが常に機能するとは限らないことを認識しているため、キャストDbSet<CategoryType>
をDbSet<IItemType>
実行できません。
DbSet<T>
ただし、Co-Variance をオンにできるインターフェイスがあります。IQueryable<IItemType>
たとえば、キャストしてみることができます。
ただし、インターフェイスに対するクエリを使用して DbSet に対してクエリを実行しようとしているようです...次を試してください
DbSet<CategoryType> set = context.Set<CategoryType>();
IQueryable<IItemType> cast = set.OfType<IITemType>(); //(or .Cast<>() works too)
IQueryable<IItemType> query = cast.Where(x => x ....);