在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"

这可能吗?反思在这种情况下有效吗?

在LINQ中为列动态分配值

简要回答:是

详细答案:是的,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});