Как программно запросить DbSet в DbContext? - PullRequest
0 голосов
/ 21 марта 2012

Я пытаюсь создать контроллер, который обслуживает запросы на редактирование для всех моих таблиц поиска. У меня есть несколько переменных DbSet в моем DbContext, которые получены из IdNamePairBase, например:

public DbSet<Country> Countries { get; set; } // Country derives from IdNamePairBase

Как я могу передать имя одного из них в запрос, чтобы получить все элементы в этом списке? Э.Г.

var list = db.GetNamedDbSet("Countries");

Затем для получения бонусных баллов мне нужно получить IEnumerable<IdNamePairBase> от list.

1 Ответ

0 голосов
/ 21 марта 2012

Вы можете использовать Set(Type type) в DbContext, если имя таблицы соответствует типу.

 public IEnumerable<IdNamePairBase> GetNamedDbSet(string dbSetName)
 {
      var property = Type.GetType(dbSetName);
      if (property == null || !property.CanRead)
      {
         throw new ArgumentException("DbSet named " + dbSetName + " does not exist." );
      }

      // at this point you might want to check that the property is an enumerable type
      // and that the generic definition is convertible to IdNamePairBase by
      // inspecting the property type.  If you're sure that these hold, you could
      // omit the check.

      return Set(type).Cast<IdNamePairBase>();
 }

Исходный ответ

Если имяиз набора соответствует имени свойства, вы можете использовать отражение.

 public IEnumerable<IdNamePairBase> GetNamedDbSet( string dbSetName )
 {
      var property = this.GetType().GetProperty( dbSetName );
      if (property == null || !property.CanRead)
      {
         throw new ArgumentException("DbSet named " + dbSetName + " does not exist." );
      }

      // at this point you might want to check that the property is an enumerable type
      // and that the generic definition is convertible to IdNamePairBase by
      // inspecting the property type.  If you're sure that these hold, you could
      // omit the check.

      var result = new List<IdNamePairBase>();
      foreach (var item in (IEnumerable)property.GetValue( this, null))
      {
          result.Add( (IdNamePairBase)item );
      }
      return result;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...