Linq列名称为变量

时间:2019-02-09 13:38:10

标签: c# sql linq

我有一个包含三列的表: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 :(得分:1)

出现问题,因为您的数据库架构未完全规范化。完全规范化的方法是将主题提取到另一个表中并创建一对一关系。但是我同意有时将标准化推到极限可能会增加相当多的复杂性,这些复杂性可能看起来有些夸大。

如果您不想更改架构,则可以将Subject属性包装到索引器中

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;