【问题标题】:Update only a single item in linq仅更新 linq 中的单个项目
【发布时间】:2010-11-10 16:16:39
【问题描述】:

目前我更新数据库中的单个项目如下:

 var master = (from tmi in db._Masters where tmi.Id == Id select tmi).FirstOrDefault();
 master.logPosition++;
 db.SubmitChanges();

这让我觉得效率低下,因为(我认为)我正在拉出一个完整的数据库行来只更新一个值。我可以使用更高效的查询吗?

【问题讨论】:

    标签: c# asp.net linq


    【解决方案1】:

    你可以通过调整你原来的linq select只选择你想要修改的字段:

    var master = (from tmi in db._Masters 
                  where tmi.Id == Id 
                  select new { tmi.logPosition }).FirstOrDefault(); 
     master.logPosition++; 
     db.SubmitChanges(); 
    

    编辑:通过将特定数据选择到关联属性中,属性 logPosition 应该失去其只读状态并完全可更新。

    var master = (from tmi in db._Masters 
                  where tmi.Id == Id 
                  select new { 
                      ID = tmi.ID, 
                      logPosition = tmi.logPosition }).FirstOrDefault(); 
     master.logPosition++; 
     db.SubmitChanges(); 
    

    【讨论】:

    • 也许是大师++?如果您选择新的 {tmi.logPosition},它将返回 logPosition 而不是将 logPosition 作为属性的类。
    • 但这会给出“无法分配属性——它是只读的”错误? (我之前确实试过)。
    • @Stephan P.:如果查询以 select tmi.logPosition 结束,那么您是对的,但是查询的结尾会创建一个匿名类型的新实例,因此 Joel 是正确的。
    • @linq - 老实说,我只关注查询本身以减少它。我将对其进行编辑,以将一些更接近完整解决方案的东西放在一起,应该可以工作。
    【解决方案2】:

    我假设这是 LINQ to SQL;如有错误请指正。

    您可以创建一个存储过程和pull that stored procedure into your DataContext,然后调用该存储过程而不是使用上述查询。

    或者,您可以手写更新查询并使用DataContext.ExecuteQuery 来执行查询。

    但是,在您分析并确定这是否真的是一个瓶颈之前,这​​一切都不重要。如果不是,我会坚持使用你已经拥有的最简单的方法。

    【讨论】:

      【解决方案3】:

      @linq

      我无法得到乔尔接受的答案来工作。

      select new { } 创建了一个不可更新的匿名类型(如您在评论中所述,另请参阅 this question),也不属于 DataContext。

      我描述了几个possible solutions

      • 存储过程
      • 查看
      • 执行命令
      • dbml 映射

      在我的博客上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-26
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多