2012-06-25 40 views
3

我在SQL这样的查询和正常工作:如何使用linq中的sql查询更新列数据?

update userinfo set Interest = 0.98 where userid = 313 

而且我想这样做的LINQ,所以我准备了以下内容:

public class TableDataDTO 
{ 
    public string Columnname { get; set; } 
    public string Value { get; set; } 
    public Type DataType { get; set; } 
} 

实现:

TableDataDTO tableData = new TableDataDTO(); 
tableData.Columnname = "Interest"; 
tableData.Value = "0.98"; 

using (dbase instance = new dbase()) 
{ 
    string predicate = string.Format("it.UserID=={0} set it.{1}={2}" , 
       313, tableData.Columnname, tableData.Value); 

    var uinfo = instance.userinfoes.Where(predicate).FirstOrDefault(); 

    if (uinfo != null) 
    { 
     instance.SaveChanges(); 
     return true; 
    } 
} 

但它给了我这个错误:

The query syntax is not valid. Near keyword 'SET' 

我将处理不同的列,所以我需要使用linq谓词来最小化代码。 我不喜欢使用任何插件来做到这一点。希望有人能帮助。

编辑

我想我的意思是"How to update data in using Dynamic linq"

EDIT2

所以这是真实的情景。用户/客户可以更新他们的信息,例如名字,姓氏,地址,城市..等等,但不能一次性更新信息。
那么这是什么意思?好吧,我可以创建一个方法,可以更新名字,接下来是姓氏,地址等等。但是如果我这样做,它会消耗大量的代码。如果只有在linq中有一个可以做SQL更新数据的代码,那么我只需要一个获取列名并设置其值的代码。希望我能解释清楚。

EDIT3

我从How to update data in linq using predicates?改问题How to update column data using sql query in linq?对我误解谓词的真正意义。

+6

我想你误会什么*谓词*指... – McGarnagle

+0

我将非常感激,如果你会纠正我。谢谢。 – fiberOptics

+0

如果你想使用变量作为列名,使用普通的sql。而且,雅,不要忘记享受SQL注入。 –

回答

1

您的谓词应该是,其中部分查询(谓词只是返回true或false)。试试这个:

instance.userinfoes.Where(user => user.userid == 313).First().Interest = 0.98; 
+0

谢谢,但那不是我想要做的。我无法在超过50栏中做到这一点。 – fiberOptics

+1

@CustomException啊,疑难杂症...你想选择50列还是更新50列......或者两者兼而有之? – McGarnagle

+0

@CustomException是否要一次使用linq更新50列.... –

0

你可以构造类似于你如何构造SQL的LINQ。通过Where和ForEach的组合,您应该能够更新所需的所有行。即:

instance.userinfoes.Where(it => it.UserId == 313).ToList() 
         .ForEach(
          it => it.Interest = 0.98M 
         ); 

有没有真正的任何方式来写类似SQL的查询文本而据我所知他们通过定期LINQ。

更多的解决方案见这个问题: Update all objects in a collection using LINQ

+0

函数是这样的http://stackoverflow.com/questions/848415/linq-dynamic-where-clause唯一的区别是,我想使用“更新”,如果它不可能,那么这是一个大问题对我来说。 – fiberOptics

+1

据我所知,没有动态LINQ支持来运行更新,因为没有实际的LINQ扩展来处理这种情况。 –