【问题标题】:Get the highest ID number in a SQL table , LINQ , C#?获取 SQL 表、LINQ、C# 中的最高 ID 号?
【发布时间】:2011-10-12 13:04:08
【问题描述】:

我们怎样才能在一个空的 SQL 表中获得最大的 ID 号?
例如:
假设我们有一个十行的表,但是所有的行都被删除了,现在我们想得到最高行的 ID !!!

下面的代码抛出异常,因为表是空的:

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

【问题讨论】:

  • 你想要下一个自动递增的主键,你的数据集中目前没有记录,对吗?
  • 我不认为你可以用 LINQ 实现,但你可以创建一个函数并通过 LINQ 调用它。
  • @AD.Net : 你能描述一下吗?
  • 描述哪一部分?您可以很容易地通过 LINQ 调用 sql 函数。我可能会这样做,因为我不知道仅通过 LINQ 是否有可能。

标签: c# asp.net sql linq


【解决方案1】:

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

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

【讨论】:

  • 我不确定此功能是否以任何其他方式公开。但是,我认为这是设置存储过程的好时机,该过程可以通过您的 LINQ to SQL ERM 公开。
  • 我想用 LINQ 实现它
  • 我有一个问题,空表的自增主键不是1吗?如果不是,系统如何决定下一个自增id(对于int类型)?
  • @Ateş GÜRAL :通过将 IDENT_SEED 添加到 IDENT_CURRENT/0
  • 我用过public int GetLastNewsID() { const string command = @"SELECT IDENT_CURRENT ('{0}') AS Current_Identity;"; int id = EntityModel.ExecuteStoreCommand(command, "News"); return id; },但它返回-1,而它必须返回4!!!
【解决方案2】:
 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

编辑:

我的回答可以帮助您摆脱空表的异常,但不能帮助您摆脱下一个自动增量值。您可以按照乔的回答并将 IDENT_CURRENT 函数包装到一个新的存储过程 GetIdentity 中,而不是使用 LINQ 调用它

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

【讨论】:

  • 应该注意,这种方法仅在您不使用某种自动递增列时才有效。
  • 好吧,接下来我想自动递增主键,数据集中当前没有记录。不是 Int32.MinValue
  • @Mohammad :您不能在客户端执行此操作,请参阅 Joe 对服务器端解决方案的回答。我的回答可以帮助您摆脱空表但不是下一个自动增量值的异常
  • 请问您为什么使用“IList”作为值和空值的类型? (我是 C# 新手,我会简单地使用“List”)
  • @wullxz :在这个特殊的例子中,这并没有给我们任何偏好,这对我来说已经是一种常见的做法。这称为基于接口的编程,接口在抽象方面提供了更大的灵活性,当通过接口引用它时,您可以用另一个类替换一个类(两者都应该实现一个公共接口)。见visualstudiomagazine.com/articles/2010/01/01/…
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 我想让它根据它在数据库中的ID号来命名上传的图像。
    • @Mohammad 插入它,读取值,然后重命名文件。您可能应该在问题中提到这就是您要尝试做的事情。
    • 如果要在 SQL Server 的表中重置标识计数器,最好将 DBCC CHECKIDENT 与 RESEED 参数一起使用。 msdn.microsoft.com/en-us/library/aa258817(v=sql.80).aspx
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 2021-12-06
      • 2019-07-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多