SQL на самом деле не может сделать это в одном запросе (за исключением некоторых расширений SQL, о которых я не знаю), поскольку SQL не может получить доступ к строке «до» или «после».
Вам нужно пройти последовательность в цикле.
Вы можете попробовать NHibernates Enumerable
, который не загружает объекты в память, а только создает их прокси. На самом деле я не думаю, что это хорошая идея, потому что она создаст прокси для целых 2 миллионов номеров.
План Б, используйте пейджинг. Грубо говоря, это выглядит так:
List<PhoneNumber> result = new List<PhoneNumber>();
int input = 1012;
int pageSize = 100;
int currentPage = 0;
int expectedNumber = input;
bool carryOn = true;
while(carryOn)
{
var numbers = session
.CreateQuery("from PhoneNumber pn where pn.Number > :input")
.SetInt("input", input)
.SetFirstResult(currentPage * pageSize)
.SetMaxResult(pageSize)
.List<PhoneNumbers>();
foreach(var number in numbers)
{
expectNumber++;
if (number.Number != expectedNumber)
{
carryOn = false;
break;
}
result.Add(number);
}
currentPage++;
}
И то же самое для диапазона в другом направлении.