获取SQL表中最高的ID号,LINQ,C#?

时间:2011-10-12 13:04:09

标签: c# asp.net sql linq

我们如何在空SQL表中获得最高的ID号? e.g:
假设我们有一个包含十行的表,但是所有行都被删除了,现在我们想获得最高行的ID!

以下代码抛出异常,因为该表为空:

var maxID = db.TableNames.Select(q => q.Id).Max();

5 个答案:

答案 0 :(得分:4)

对于SQL Server,请尝试the IDENT_CURRENT函数。

请注意,由于事务失败等原因,标识值序列中可能存在间隙,因此无法保证使用此值提交行。

答案 1 :(得分:3)

 IList<int> values = new List<int> { 1, 2, 3, 4, 5 };
 IList<int> emptyValues = new List<int> { };

 int max = values.DefaultIfEmpty(Int32.MinValue)
                                    .Max();

 // do not throw exception
 int maxEmpty = emptyValues.DefaultIfEmpty(Int32.MinValue)
                           .Max();

// max == 5
// maxEmpty == Int32.MinValue

修改

我的答案可以帮助您在空表但不是下一个自动增量值的情况下摆脱异常。您可以关注Joe的回答并将IDENT_CURRENT函数包装到新的存储过程GetIdentity中,而不是使用LINQ

调用它
var nextIdent = (from a in db.GetIdentity("TableName")) + 1;

答案 2 :(得分:0)

如果ID是标识列,则以下SQL将返回您要查找的内容。 LINQ可能无法直接访问此函数,在这种情况下,您需要运行一个简单的DataReader。

USE DATABASENAME;
GO
DBCC CHECKIDENT ("TABLENAME", NORESEED);
GO

答案 3 :(得分:0)

我不知道为什么你需要这样做,因为它听起来像你正在尝试做一些hacky无论如何,如果表是空的,为什么不重置身份计数器(如果完整性参考允许你这样做):

ALTER TABLE MyTable ALTER COLUMN MyColumn INT IDENTITY (0, 1)

答案 4 :(得分:0)

我不知道您是否被锁定在数据库架构中,但这是人们使用GUID的原因。你可以考虑调查一下。