我有以下情况:
这是我的模特:
TableA{
public int Id {get; set;}
public string Column1 {get; set;}
public string Column2 {get; set;}
public string Column3 {get; set;}
...
public string ColumnN {get; set;}
}
TableB{
public int Id {get; set;}
public string Column1 {get; set;}
public string Column2 {get; set;}
public string Column3 {get; set;}
...
public string ColumnN {get; set;}
}
现在,假设我想将一些值从TableA复制(传输)到TableB。为此,我在我的数据库中创建了一个表,其中包含TableA中哪些列与TableB相关联的所有关系。
我使用以下代码来获取需要复制的列:
var listColumnsToCopy = db.TableRelationsAB.Where(tf => tf.Copy == 1);
有了这个我有一个要复制的所有列的列表。
此时我试图在C#中使用foreach语句来遍历列表中的列,并且只能为这些列分配值
Foreach(var col in listColumnsToCopy){
TableA.col????? = "some value"; ---> HERE
}
以上代码是逐列手动执行的替代方法:
TableA.Column1 = "some value"
TableA.Column2 = "some value"
...
TableA.ColumnN = "some value"
这可能吗?在这种情况下,反思会起作用吗?
答案 0 :(得分:1)
简要回答:是的
详细答案: 是的,使用可以使用反射存档此类行为,只需使用其名称作为匹配条件获取相应表类型的PropertyInfo对象,并设置所需的值。但那会很慢。最快的方法是编写SQL存储过程,或者至少使用动态编译。
答案 1 :(得分:0)
var listColumnsToCopy = db.TableRelationsAB.Where(tf => tf.Copy == 1)
.Select(a=> new{ColumnA = a.Column1
,ColumnB=a.Column2??"some value"});
这将用您的值替换Column2中的空值;
或者如果您的Column2有空字符串而不是null,则可以使用
var listColumnsToCopy = db.TableRelationsAB.Where(tf => tf.Copy == 1)
.Select(a=> new{ColumnA = a.Column1
,ColumnB=a.Column2=""?"some value":a.Column2});