C# 获取sql server中最后一个插入的行,该行的id为主键,并且是标识
我尝试了几种方法使用linq查询来检索插入sql server表中的最后一行 我需要这样的东西C# 获取sql server中最后一个插入的行,该行的id为主键,并且是标识,c#,asp.net,asp.net-mvc,linq,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Linq,Asp.net Mvc 4,我尝试了几种方法使用linq查询来检索插入sql server表中的最后一行 我需要这样的东西 var lastId = from u in context.sistema_Documentos where u.id == max select u; 有些人说这是不可能的,有些人说这是不安全的,或者会严重影响性能。。如何执行此查询 附言。。这是一个好方法吗 var lastId = from u in context.sistema_Documentos orderby u.id descen
var lastId = from u in context.sistema_Documentos where u.id == max select u;
有些人说这是不可能的,有些人说这是不安全的,或者会严重影响性能。。如何执行此查询
附言。。这是一个好方法吗
var lastId = from u in context.sistema_Documentos orderby u.id descending select u.id;
无性能问题,简单明了的查询:
var lastId = (from u context.sistema_Documentos
Select u.id).Max();
但是,如果您的场景是希望在一个uppdate中设置某种主-详细关系,那么这可能不是正确的方法。在这种情况下,您应该使用实体本身。正如Joel提到的,它并不总是返回最后一个
例如
这将在一个事务中正确处理PK/FK分配。在执行
SubmitChanges()
方法后,您要查找的标识值可用。你可以这样读:
context.InsertOnSubmit(entityToInsert);
context.SubmitChanges();
Var lastinsertedId = entityToInsert.Id;
这个问题有用吗?这种方法在高使用率系统中是绝对不安全的。你打算怎么做?你需要它做什么?您正在执行插入操作,只需要插入的ID吗?它是在插入实体后立即插入的,或者它不相关?如果我真的想知道每一行是何时插入的,我会针对每一行存储一个日期时间,但不确定我是否只想依赖自动递增标识列的值。是否要调用
scope\u identity()
在插入后立即运行
。这里的上下文是什么?EF或linq到sql?在高使用率系统中,此方法是不安全的。如果你有很多次插入,可能会得到一个不正确的id。没错,我没有读“最后一次插入”,这种方法确实显示了最大id。坏主意,如果有人在你之后插入呢?@Jodrell:读我的更新。OP的伪代码是我改为在Linq中工作的代码。它在功能上不是最后一个插入的,但它是在执行点具有最高Id的。这一点是,使用数据库的主要原因之一是允许并发访问数据,对吗?因此,多个用户可能同时尝试插入或删除数据。通过查询获取max id,即使是在完成插入后,也不需要是刚刚插入的id。可能插入了另一行、删除了您的行、更改了标识种子并插入了另一行。你不知道。在我发表上述评论后,我正在准备这个答案,但工作被打扰了,我错过了我的窗口:)@JoelEtherton-是的,我知道。我在工作中总是有这个问题。
context.InsertOnSubmit(entityToInsert);
context.SubmitChanges();
Var lastinsertedId = entityToInsert.Id;