我需要从数据库中获取1000行,同时将它们标记为“进行中”。 这样,另一个线程也不能采用相同的1000行并处理它们。
使用linq,我会这样做:
msgs =(来自database.messages中的m where(m.status == MESSAGESTATUSINIT) 选择m)。取(1000).ToList();
理想情况下,我会同时将状态设置为MESSAGESTATUSPROCESSING。当然这必须是原子的。
任何想法?还是回到SQL?
谢谢!
答案 0 :(得分:4)
你不能在linq2sql中这样做。使用存储过程,并在设计器上对其进行配置以输出Message。这样,您就可以操作已加载的实体并正常提交更改。
检查这个怎么做(特别是将SPROC方法的返回类型映射到数据模型类): http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx
答案 1 :(得分:1)
Linq本身不会提供这种能力;请记住Linq ==查询。数据更新发生在其他地方。
在这种情况下,编写存储过程以返回结果可能会更好; sproc可以更新表并以原子方式返回结果,然后您的应用程序将只有一个调用。
答案 2 :(得分:0)
您可以使用锁定{}来包围代码。