Найти первый бесплатный идентификатор - PullRequest
0 голосов
/ 23 февраля 2019

Один из моих небольших проектов управления базами данных (написанный на delphi) использовал sql-запросы для поиска первого свободного идентификатора таблицы mysql.

Пример: мне нужно найти первый свободный идентификатор (дыру) в таблицекак это:

| id   | Col1 |
|------|------|
| 5101 | ABC  |
| 5102 | BCD  |
| 5103 | CDE  |
| 5105 | EFG  | ? first missing id
| 5106 | GHI  |
| 5108 | ILM  |

Код должен найти первый свободный идентификатор 5104

Вот как я это сделаю в SQL (в старом проекте):

SELECT
  MIN((doc.id + 1)) AS nextID
FROM (doc
  LEFT JOIN doc doc1
    ON (((doc.id + 1) = doc1.id)))
WHERE (ISNULL(doc1.id) AND (doc.id > 5000))

Теперь, когда я переписываю на языке c #, мне нужно преобразовать операторы sql в запрос LINQ (который использует Devart dotConnect для mysql Entity Framework).Начиная отсюда:

DC db = new DC();
var nums = db.Documentos.OrderBy(x => x.Id);

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Это может дать вам все пробелы в вашей таблице

var nums= (new List<int> (){1,2,3,25,4,5,6,7,8, 12, 15,21,22,23}).AsQueryable();

nums
  .OrderBy(x => x)
  .GroupJoin(nums, n=> n + 1, ni => ni, (o,i)=> new {o, i})
  .Where(t=> !(t.i is IGrouping<int, int>))
  .Dump();

.Net Fiddle

0 голосов
/ 23 февраля 2019

Другой метод (аналогичный тому, который вы используете сейчас).
Предположим, у вас есть массив целых чисел (или другой тип коллекции), подобный этому:

var myIDs = new int[] { 5101, 5113, 5102, 5103, 5110, 5104, 5105, 5116, 5106, 5107, 5108, 5112, 5114, 5115 };

Если он еще не упорядочен, OrderBy() it:

myIDs = myIDs.OrderBy(n => n).ToArray();

Извлечь первое число, которое меньше (next number) + 1:

int result = myIDs.Where((n, i) => (i < myIDs.Length - 1) && (n + 1 < myIDs[i + 1])).FirstOrDefault();

Если ни один из членов этой коллекции не удовлетворяет условию, возьмитепоследний и добавьте 1:

result = result == default ? myIDs.Last() + 1 : result;
0 голосов
/ 23 февраля 2019

С Может ли LINQ использоваться для поиска пропусков в отсортированном списке? :

var strings = new string[] { "7", "13", "8", "12", "10", "11", "14" };
var list = strings.OrderBy(s => int.Parse(s));
var result = Enumerable.Range(list.Min(), list.Count).Except(list).First(); // 9

По сути, упорядочить список.Затем создайте массив последовательных чисел (1,2,3...) от минимума до максимума.Проверьте пропущенные значения в списке и возьмите первое.Это первое пропущенное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...