如何在Linq中使用SQL查询更新列数据?

4

我在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谓词来尽量减少代码量。 我不喜欢使用任何插件来实现。希望有人能帮忙。

编辑

我想我的意思是"如何使用动态linq更新数据"

编辑2

这是真正的场景。用户/客户可以更新他们的信息,例如名字、姓氏、地址、城市等,不是一次性更新,而是一个接一个地更新信息。
那么这意味着什么?好的,我可以创建一个方法来更新名字,下一个是姓氏,地址等等。但如果我这样做,会消耗很多代码。如果只有linq中的代码可以像SQL一样更新数据,那么我只需要一个代码来获取列名并设置其值。希望我解释得清楚。

编辑3

我已经将问题从如何使用谓词在linq中更新数据?更改为如何使用sql查询在linq中更新列数据?,因为我误解了谓词的真正含义。


6
我认为你误解了“谓词”的意思...... - McGarnagle
如果您能纠正我的错误,我将不胜感激。谢谢。 - fiberOptics
如果你想使用变量作为列名,请使用纯SQL。还有,嗯,别忘了享受SQL注入的乐趣。 - J-16 SDiZ
1
“Predicate”在这个上下文中类似于“条件语句”。 “Where”是一个过滤器。 uinfo将仅包含满足条件的所有instance.userinfoes元素。 - Jason Larke
@CustomException 是的,你必须使用SQL。 - J-16 SDiZ
显示剩余2条评论
2个回答

1

你的谓词应该只是查询的where部分(谓词只返回true或false)。试试这个:

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

谢谢,但那不是我想做的。我无法在50多列中完成这个任务。 - fiberOptics
1
@CustomException 哦,我明白了...你想选择50个列还是更新50个列...或者两者都要? - McGarnagle
@pratapk 不,我只是不想为“每个”列创建查询。 - fiberOptics
@CustomException 所以你基本上想要在程序中动态地创建一个谓词,对吗?类似于这个链接中的内容?https://dev59.com/Uk_Ta4cB1Zd3GeqPCZ5A - McGarnagle

0

您可以将LINQ的结构与SQL的结构类似。通过Where和ForEach的组合,您应该能够更新所有需要的行。例如:

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

据我所知,实际上没有办法将类似SQL的查询作为文本编写并传递给常规LINQ。

有关更多解决方案,请参见此问题: 使用LINQ更新集合中的所有对象


函数的形式类似于 https://dev59.com/3XRA5IYBdhLWcg3wvQdh,唯一的区别是我想使用 "UPDATE",如果不可能,那对我来说是一个大问题。 - fiberOptics
1
据我所知,目前没有动态LINQ支持运行更新操作,因为通常情况下没有实际的LINQ扩展来处理这个问题。 - Jason Larke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接