使用 Linq to Sql 识别 运行 的开始和结束

Identify beginning and end of a run using Linq to Sql

我有一个问题,我已经设法通过迭代解决了(如图所示),但我认为一定有一种方法可以查询数据库并获得相同的结果?

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++;
    }                    
}

基本上我有一个 table 的整数,从 0 开始到 100 结束。某处的数据存在差距,可能是 24-58 或 35-93 等。基于boolean 值我需要确定间隙的开始或结束。

示例数据

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

您可以使用 Enumerable.RangeExcept 来获得想要的结果

//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