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, который выполняет эту логику (то есть возвращает правильный столбец в переключателе на основе языка, который вы хотите). Нет способа волшебным образом выбрать "столбец"