2016-08-15 2 views
2

coluld, пожалуйста, будьте любезны, чтобы рассказать мне, как выбрать DbSet в зависимости от строковой переменной? Что у меня есть:Как использовать динамический DbSet в Entity Framework?

public class DataContext : DbContext 
{ 
    public DataContext() : base("myDb") { } 

    public DbSet<Entry> RurEntries { get; set; } 
    public DbSet<Entry> UsdEntries { get; set; } 
    public DbSet<Entry> EurEntries { get; set; } 
} 

Для каждой валюты есть 3 таблицы: Rur, Usd, Eur. Все имеют одинаковую структуру. Существует строковая переменная CurrentCurrency, которая изменена с пользовательского интерфейса и может быть одной из трех валют. В моем предыдущем коде без Entity Framework У меня был код, читать дб с чистым SQL, как коснуться:

string sqlQuery = "Select * from " + CurrentCurrency 

Теперь я решил переписать код с Entity Framework и столкнулся с этой проблемой. Любой ответ будет оценен. Заранее спасибо.

+3

Почему вы не просто ввести флаг таблицы вместо создания трех таблиц? – user3185569

+0

Что вы уже пробовали и не смогли? –

+0

Все 3 таблицы имеют поле unique_id, которое я получаю от другого программного обеспечения. Я использовал уникальный флаг в этом столбце, и это может быть проблемой, если я поместил все записи в ту же таблицу. – Smilley

ответ

1

Вы можете использовать только лица класса T в DbSet<T> один раз в DbContext , Ваш код не будет работать. См. Также Entity Framework 6 Creating Two table from the same entity object.

Учитывая Ваш комментарий:

Все три таблицы имеют unique_id поле, которые я получаю от другого программного обеспечения. Я использовал уникальный флаг на этой колонке, и это может быть проблемой, если я положил все записи в одной таблице

Вам просто нужно составной первичный ключ, состоящий из валюты и ExternalId, как объяснено в Composite Key with EF 4.1 Code First:

public class Entry 
{ 
    [Key] 
    [Column(Order = 0)] 
    public string Currency { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    public string ExternalId { get; set; } 
} 

Тогда вы можете прочитать «EUR» строки, как это:

var eurRows = dbContext.Entries.Where(e => e.Currency == "EUR"); 
+0

Спасибо. Это прекрасно работает. – Smilley

0

Вы можете выполнять необработанные SQL-запросы в Entity Framework. Как это:

var curs = context.Database.SqlQuery<Entry>("Select * from " + CurrentCurrency").ToList(); 

Вы также можете сделать это более аккуратно и создать хранимую процедуру, в которой вы отправляете параметр и выполнить SELECT заявление на основе этого параметра. Затем, используя инфраструктуру Entity, вы вызываете эту процедуру, сопоставляя результаты с List<Entry>.

Однако, как я уже говорил в комментариях, я лично предпочитаю иметь только одну таблицу с колонкой CurrenyCode. Вместо того, чтобы иметь 3 таблицы с одинаковой структурой, но с разными данными. Тогда вы можете запросить так:

var curs = var curs = context.Currencies.Where(x=> x.CurrencyCode = CurrentCurrency) 
             .ToList(); 
2

Вы можете просто переключиться на ваш CurrentCurrency строку, чтобы установить, что вам нужно:

var db = new DataContext(); 
     var CurrentCurrency = "RUR"; 
     DbSet<Entry> set = null; 
     switch (CurrentCurrency) { 
      case "RUR": 
       set = db.RurEntries; 
      break; 
      case "EUR": 
       set = db.EurEntries; 
      break; 
      case "USD": 
       set = db.UsdEntries; 
      break; 
      default: 
       throw new Exception(); 
     } 
     var res = set.ToList(); 
+0

Именно то, что мне было нужно. Благодарю. – Smilley

+0

Поскольку @CodeCaster написал, что это не работает, поскольку я могу использовать только класс сущности T в DbSet один раз за DbContext. Наконец, нужно было ввести полевую валюту в мой класс. – Smilley

+0

@Smilley Я думаю, что это должно работать, если вы используете наследование, а Entry будет просто абстрактным базовым классом. Во всяком случае, решение, предлагаемое CodeCaster, кажется более прямым. – 3615