我有一个包含三列的表: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
是在另一种方法中设置的。
答案 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;