在LINQ中为列动态分配值
本文关键字:动态分配 LINQ | 更新日期: 2023-09-27 18:00:00
我有以下场景:
这是我的型号:
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。为此,我在数据库中创建了一个表,在该表中,我拥有表a中哪一列与表B关联的所有关系。
我使用以下代码来获取需要复制的列:
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"
这可能吗?反思在这种情况下有效吗?
简要回答:是
详细答案:是的,use可以使用反射来归档这种行为,只需使用其名称作为匹配条件来获取相应表类型的PropertyInfo对象,并设置所需的值。但这将是缓慢的。最快的方法是编写SQL存储过程,或者至少使用动态编译。
是的,这可以通过类似的方法来完成
var listColumnsToCopy = db.TableRelationsAB.Where(tf => tf.Copy == 1)
.Select(a=> new{ColumnA = a.Column1
,ColumnB=a.Column2??"some value"});
这将用您的值替换第2列中的空值;
或者,如果第2列有空字符串而不是null,则可以使用
var listColumnsToCopy = db.TableRelationsAB.Where(tf => tf.Copy == 1)
.Select(a=> new{ColumnA = a.Column1
,ColumnB=a.Column2=""?"some value":a.Column2});