【发布时间】:2010-11-10 16:16:39
【问题描述】:
目前我更新数据库中的单个项目如下:
var master = (from tmi in db._Masters where tmi.Id == Id select tmi).FirstOrDefault();
master.logPosition++;
db.SubmitChanges();
这让我觉得效率低下,因为(我认为)我正在拉出一个完整的数据库行来只更新一个值。我可以使用更高效的查询吗?
【问题讨论】:
目前我更新数据库中的单个项目如下:
var master = (from tmi in db._Masters where tmi.Id == Id select tmi).FirstOrDefault();
master.logPosition++;
db.SubmitChanges();
这让我觉得效率低下,因为(我认为)我正在拉出一个完整的数据库行来只更新一个值。我可以使用更高效的查询吗?
【问题讨论】:
你可以通过调整你原来的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();
【讨论】:
select tmi.logPosition 结束,那么您是对的,但是查询的结尾会创建一个匿名类型的新实例,因此 Joel 是正确的。
我假设这是 LINQ to SQL;如有错误请指正。
您可以创建一个存储过程和pull that stored procedure into your DataContext,然后调用该存储过程而不是使用上述查询。
或者,您可以手写更新查询并使用DataContext.ExecuteQuery 来执行查询。
但是,在您分析并确定这是否真的是一个瓶颈之前,这一切都不重要。如果不是,我会坚持使用你已经拥有的最简单的方法。
【讨论】:
@linq
我无法得到乔尔接受的答案来工作。
select new { } 创建了一个不可更新的匿名类型(如您在评论中所述,另请参阅 this question),也不属于 DataContext。
我描述了几个possible solutions
在我的博客上。
【讨论】: