2016-10-21 2 views
0

В моем контексте EF у меня есть иерархия классов, управляемая таблицей на основе иерархического подхода.EF - Извлечение всех записей таблицы определенного типа для каждой иерархии

Поэтому у меня есть базовый абстрактный класс и куча классов, которые вытекают из него:

public abstract class BaseClass 
{ 
    [Required] 
    public int Id {get; set;} 

    ... 
} 

public abstract class ExtendedClass1 : BaseClass 
{ 

    ... 

} 

public abstract class ExtendedClass2 : BaseClass 
{ 

    ... 

} 

Классов настроены следующим образом:

public class ExtendedClass1Configuration : 
    EntityTypeConfiguration<ExtendedClass1> 
{ 
    ... 

    this.Map(m => m.Requires("Discriminator").HasValue("ExtendedClass1")); 
} 

Чтобы получить доступ к базе данных я использую хранилище , основанный на общем хранилище:

public abstract class Repository<TEntity> : IRepository<TEntity> where TEntity: BaseClass 
{ 
    protected DbContext context; 

    DbSet<TEntity> GetSet() 
    { 
     return this.context.Set<TEntity>(); 
    } 

    public virtual void Add(TEntity entity) 
    { 
     this.GetSet().Add(entity); 
    } 

    ... 
} 

public class BaseClassRepository : Repository<BaseClass>, IBaseClassRepository 
{ 

    ... 

} 

Я хочу добавить метод к своему репозиторий, который будет извлекать все классы определенного подтипа (например, все записи типа ExtendedClass1).

Я попробовал несколько подходов следующим образом, без особого успеха:

public IEnumerable<BaseClass> GetByType(Type type) { 
    return context.Set<BaseClass>().OfType<type>(); 
} 

Это дает мне следующую ошибку компиляции:

The type or namespace name 'type' could not be found

Другой подход, который я пытаюсь сейчас это что-то вроде этого:

public IEnumerable<TBaseClass> GetByType() where TBaseClass : BaseClass { 
    return context.Set<BaseClass>().OfType<TBaseClass>(); 
} 

Что я делаю неправильно? Как я могу это реализовать?

+0

'OfType ();' что это, черт возьми? (если не ошибка) – Will

+0

Проверьте эту строку на методе GetByType: return context.Set () .OfType (); Это должен быть контекст возврата. Установить () .OfType (); Имя типа не является переменной. –

+1

Эта строка не компилируется, это только, чтобы сообщить вам различные подходы, которые я пытаюсь @Will – user449689

ответ

2
public IEnumerable<BaseClass> GetByType(Type type) 
{ 
    return context.Set<BaseClass>().OfType<type>(); 
} 

не правильно, используйте

public IEnumerable<BaseClass> GetByType<T>() 
{ 
    return context.Set<BaseClass>().OfType<T>(); 
} 

Typeparams FTW.

+0

Еще раз спасибо !!! – user449689