Получить самый большой идентификационный номер в таблице SQL, LINQ, C #? - PullRequest
0 голосов
/ 12 октября 2011

Как мы можем получить наибольший номер идентификатора в пустой таблице SQL?
например:
Предположим, у нас есть таблица с десятью строками, но все строки были удалены, теперь мы хотим получить самый высокий идентификатор строки !!!

Приведенный ниже код вызывает исключение, поскольку таблица пуста:

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

Ответы [ 5 ]

4 голосов
/ 12 октября 2011

Для SQL Server попробуйте функцию IDENT_CURRENT .

Обратите внимание, что в последовательностях значений идентификаторов могут быть пробелы из-за неудачных транзакций и т. Д., Поэтому нет гарантии, что строка когда-либо была зафиксирована с этим значением.

3 голосов
/ 12 октября 2011
 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;
0 голосов
/ 14 октября 2011

Я не знаю, заблокированы ли вы в вашей схеме БД, но это причина, по которой люди используют GUID.Вы можете рассмотреть это.

0 голосов
/ 12 октября 2011

Я не знаю, почему вам нужно сделать это, поскольку это звучит так, как будто вы пытаетесь сделать что-то хакерское. В любом случае, если таблица пуста, почему бы вам не сбросить счетчик Identity (если ссылка на целостность позволяет вам это сделать):

ALTER TABLE MyTable ALTER COLUMN MyColumn INT IDENTITY (0, 1)
0 голосов
/ 12 октября 2011

Если ID - это столбец идентификаторов, следующий SQL вернет то, что вы ищете.LINQ может не дать вам прямой доступ к этой функции, и в этом случае вам потребуется запустить простой DataReader.

USE DATABASENAME;
GO
DBCC CHECKIDENT ("TABLENAME", NORESEED);
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...