C# linq и многоязычная база данных

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

id | name_en | 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???
});
}
}

1 ответ

Решение

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

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

Другие вопросы по тегам