Определите начало и конец цикла, используя Linq для Sql - PullRequest
0 голосов
/ 21 января 2020

У меня есть проблема, которую мне удалось решить с помощью итерации (показано), но я думаю, что должен быть способ сделать запрос к базе данных и получить тот же результат?

short id;
if (someBoolean)
{
    id = 99;
    while (id > 0)
    {
        if (!db.MY_TABLEs.Any(x => x.ID == id))
            break;

        id--;
    }
}
else
{
    id = 1;
    while (id < 100)
    {
        if (!db.MY_TABLEs.Any(x => x.ID == id))
            break;

        id++;
    }                    
}

В основном у меня есть таблица, полная целых чисел, которая начинается с 0 и заканчивается на 100. В данных где-то существует пробел, может быть 24-58 или 35-93 и т. д. c. На основе значения boolean мне нужно определить либо начало, либо конец разрыва.

Пример данных

{ 0, 1, 2, 98, 99, 100 }
// Start of gap, returns 3
// End of gap, returns 97

1 Ответ

2 голосов
/ 21 января 2020

Вы можете использовать Enumerable.Range и Except, чтобы получить желаемый результат

//Input array { 0, 1, 2, 98, 99, 100 };
var array = db.MyTables.Select(x => x.Id).ToList();

//Get the first and last elements
int a = array.OrderBy(x => x).First();
int b = array.OrderBy(x => x).Last();

//Fill the complete list
var completelist = Enumerable.Range(a, b - a + 1).ToList();

//Filter the missing list
var missingfromlist = completelist.Except(array).ToList();

//Read first and last element from missing list
Console.WriteLine($"Start of gap: { missingfromlist.First()}, End of gap : { missingfromlist.Last()}");

Выход

Start of gap: 3, End of gap : 97
...