2016-10-05 2 views
-2

В моем приложении имеется многоязычная база данных. Необходимо загрузить списки из базы данных языка, заданного в пользовательской программе. Я использую библиотеку Dbling и теперь 3 дня царапаю головы, как динамически беру данные из базы данных, строя запрос linq. В следующей таблице указаны следующие столбцы:C# linq и многоязыковая база данных

ID | name_ru | name_ru

Предположим, что язык по умолчанию - русский. Тогда при инициализации приложения, вы должны принять всю информацию на русском

DbMetal utility created my class: 

    // 
    // ____ _  __ __  _  _ 
    // | _ \| |__ | \/ | ___| |_ __ _| | 
    // | | | | '_ \| |\/| |/ _ \ __/ _` | | 
    // | |_| | |_) | | | | __/ || (_| | | 
    // |____/|_.__/|_| |_|\___|\__\__,_|_| 
    // 
    // Auto-generated from main on 2016-09-30 22:24:51Z. 
    // Please visit http://code.google.com/p/dblinq2007/ for more information. 
    // 
    using System; 
    using System.ComponentModel; 
    using System.Data; 
    #if MONO_STRICT 
     using System.Data.Linq; 
    #else // MONO_STRICT 
     using DbLinq.Data.Linq; 
     using DbLinq.Vendor; 
    #endif // MONO_STRICT 
     using System.Data.Linq.Mapping; 
    using System.Diagnostics; 

    namespace MMS.Model.Test 
    { 
     public partial class Main : DataContext 
     { 

      #region Extensibility Method Declarations 
      partial void OnCreated(); 
      #endregion 

      partial void OnCreated() 
      { 

      } 
      public Main(string connectionString) : 
       base(connectionString) 
      { 
       this.OnCreated(); 
      } 

      public Main(string connection, MappingSource mappingSource) : 
       base(connection, mappingSource) 
      { 
       this.OnCreated(); 
      } 

      public Main(IDbConnection connection, MappingSource mappingSource) : 
       base(connection, mappingSource) 
      { 
       this.OnCreated(); 
      } 
    public Table<ListLips> ListLips 
      { 
       get 
       { 
        return this.GetTable<ListLips>(); 
       } 
      } 
[Table(Name = "main.list_lips")] 
    public partial class ListLips : System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged 
    { 

     private static System.ComponentModel.PropertyChangingEventArgs emptyChangingEventArgs = new System.ComponentModel.PropertyChangingEventArgs(""); 

     private int _id; 

     private string _nameRu; 

     private string _nameEn; 

     #region Extensibility Method Declarations 
     partial void OnCreated(); 

     partial void OnIDChanged(); 

     partial void OnIDChanging(int value); 

     partial void OnNameRuChanged(); 

     partial void OnNameRuChanging(string value); 

     partial void OnNameENChanged(); 

     partial void OnNameENChanging(string value); 
     #endregion 


     public ListLips() 
     { 
      this.OnCreated(); 
     } 

     [Column(Storage = "_id", Name = "id", DbType = "INTEGER", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.Never, CanBeNull = false)] 
     [DebuggerNonUserCode()] 
     public int ID 
     { 
      get 
      { 
       return this._id; 
      } 
      set 
      { 
       if ((_id != value)) 
       { 
        this.OnIDChanging(value); 
        this.SendPropertyChanging(); 
        this._id = value; 
        this.SendPropertyChanged("ID"); 
        this.OnIDChanged(); 
       } 
      } 
     } 

     [Column(Storage = "_nameRu", Name = "name_ru", DbType = "VARCHAR (30)", AutoSync = AutoSync.Never)] 
     [DebuggerNonUserCode()] 
     public string NameRu 
     { 
      get 
      { 
       return this._nameRu; 
      } 
      set 
      { 
       if (((_nameRu == value) 
          == false)) 
       { 
        this.OnNameRuChanging(value); 
        this.SendPropertyChanging(); 
        this._nameRu = value; 
        this.SendPropertyChanged("NameRu"); 
        this.OnNameRuChanged(); 
       } 
      } 
     } 

     [Column(Storage = "_nameEn", Name = "name_en", DbType = "VARCHAR (30)", AutoSync = AutoSync.Never)] 
     [DebuggerNonUserCode()] 
     public string NameEN 
     { 
      get 
      { 
       return this._nameEn; 
      } 
      set 
      { 
       if (((_nameEn == value) 
          == false)) 
       { 
        this.OnNameENChanging(value); 
        this.SendPropertyChanging(); 
        this._nameEn = value; 
        this.SendPropertyChanged("NameEN"); 
        this.OnNameENChanged(); 
       } 
      } 
     } 

     public event System.ComponentModel.PropertyChangingEventHandler PropertyChanging; 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

     protected virtual void SendPropertyChanging() 
     { 
      System.ComponentModel.PropertyChangingEventHandler h = this.PropertyChanging; 
      if ((h != null)) 
      { 
       h(this, emptyChangingEventArgs); 
      } 
     } 

     protected virtual void SendPropertyChanged(string propertyName) 
     { 
      System.ComponentModel.PropertyChangedEventHandler h = this.PropertyChanged; 
      if ((h != null)) 
      { 
       h(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
     } 
} 

Кроме того, я создал класс POCO, который будет хранить данные:

public class ListRegistered 
    { 
     private int _id; 
     private string _name; 

     public ListRegistered() 
     { 

     } 

     public int ID 
     { 
      get { return this._id; } 
      set { this._id = value; } 
     } 

     public string Name 
     { 
      get { return this._name; } 
      set { this._name = value; } 
     } 
    } 

Теперь я сделать запрос:

public class PersonInformationModel 
    { 

     private static string language = "ru" // We assume that this is the current language; 


     public List<MMS.Model.POCO.ListRegistered> GetRegisteredList() 
     { 
      Main dbContext = new Main(DatabaseConnect.GetConnectionContext(), new SqliteVendor()); 

var q = (from o in dbContext.ListRegistered select new MMS.Model.POCO.ListRegistered() { 
    Name = // <------- How do I get here to dynamically o.NameRu or o.NameEn??? 
}); 
} 
} 
+2

Все это очень приятно узнать, но вы можете задать реальный вопрос. – sokkyoku

ответ

0

Это было бы легко сделать в LINQ, только если у вас была таблица для перевода вместо 1 колонки на язык (что очень неустранимо и вернется, чтобы повредить вам позже).

В вашей ситуации лучшее, что вы можете сделать, это добавить свойство для имени в Poco с помощью getter, который выполняет эту логику (то есть возвращает правильный столбец в коммутаторе на основе нужного вам языка). Никакой способ магически не выбрать «столбец»

Смежные вопросы