动态地为LINQ中的列分配值

时间:2015-06-27 20:05:12

标签: c# linq entity-framework linq-to-sql linq-to-entities

我有以下情况:

这是我的模特:

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"

这可能吗?在这种情况下,反思会起作用吗?

2 个答案:

答案 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});