Имя столбца Linq как переменная - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть таблица с тремя столбцами: Subject1, Subject2, Subject3.И у меня есть следующий запрос:

Schedule update = (from s in _db.Information
                   where s.Id == Id
                   select s).Single();

update.Subject2= subjectStatus;  
_db.SaveChanges(); 

Как я могу заменить имя столбца переменной?Примерно так:

string customColumnName = "Subject" + selectedNumber;
update.customColumnName = subjectStatus;

Переменная selectedNumber задается другим методом.

1 Ответ

0 голосов
/ 09 февраля 2019

Проблема возникает, потому что ваша схема БД не полностью нормализована.Полностью нормализованный подход будет состоять в том, чтобы выделить предмет в другую таблицу и создать отношение 1 к n.Но я согласен, что иногда нормализация, доведенная до предела, может добавить немного сложности, которая может показаться преувеличенной.

Если вы не хотите изменять свою схему, вы можете заключить свои свойства Subject вindexer

public class Schedule
{
    public string Subject1 { get; set; }
    public string Subject2 { get; set; }
    public string Subject3 { get; set; }

    public string this[int index]
    {
        get {
            switch (index) {
                case 1: return Subject1;
                case 2: return Subject2;
                case 3: return Subject3;
                default: return null;
            }
        }
        set {
            switch (index) {
                case 1: Subject1 = value; break;
                case 2: Subject2 = value; break;
                case 3: Subject3 = value; break;
                default: break;
            }
        }
    }

Может использоваться следующим образом:

update[selectedNumber] = "Subject" + selectedNumber;

Недостатком является то, что это работает только для одной группы свойств, поскольку вы можете иметь только один индексатор с этой подписью;однако вы можете расширить его, включив в него имя свойства, если у вас есть более одного пронумерованного свойства.

public string this[string propertyName, int index]

C # не имеет именованных индексаторов;однако вы можете создать его с помощью посредника.В следующем примере я использую для этой цели вложенный класс.

public class SubjectAccessor
{
    private readonly Schedule _schedule;

    public SubjectAccessor(Schedule schedule) { _schedule = schedule; }

    public string this[int index]
    {
        get {
            switch (index) {
                case 1: return _schedule.Subject1;
                case 2: return _schedule.Subject2;
                case 3: return _schedule.Subject3;
                default: return null;
            }
        }
        set {
            switch (index) {
                case 1: _schedule.Subject1 = value; break;
                case 2: _schedule.Subject2 = value; break;
                case 3: _schedule.Subject3 = value; break;
                default: break;
            }
        }
    }
}

public SubjectAccessor Subject { get; }

public Schedule()
{
    Subject = new SubjectAccessor(this);
}

Может использоваться следующим образом:

update.Subject[selectedNumber] = "Subject" + selectedNumber;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...