Найти отверстие в последовательности, используя Linq to Sql
Я использую Linq to Sql против базы данных SQL Server Compact. Мне нужен быстрый способ найти первую дыру в столбце на основе целых чисел или, если нет ни одного, наибольшее число + 1.
Если бы я делал это с помощью SQL, я бы сделал что-то вроде этого:
SELECT IdLegacy+1 FROM FLUID AS t1
LEFT JOIN FLUID as t2
ON t1.IdLegacy = t2.IdLegacy+1
WHERE t2.IdLegacy IS NULL
В принципе мне нужно что-то похожее в Linq на Sql, чтобы добиться того же. Поскольку он будет вызываться на каждой вставке, мне нужно, чтобы он был быстрым и предпочтительным, элегантным:-D.
Спасибо
2 ответа
Левое внешнее соединение выглядит так в LINQ to SQL
from t1 in fluid
join t2 in fluid on t1.LegacyId + 1 equals t2.LegacyId into t3
from maybeGap in t3.DefaultIfEmpty()
where maybeGap == null
select new { t1 = t1 }
maybeGap
теперь отражает запись, которая является left outer join
из жидкости. Возможно, что поставщик LINQ для SQL Compact ограничен, так как SQL Compact очень ограничен, но в этом его суть.
Вы можете проверить это с помощью этого небольшого теста:
var list = new List<int> { 1, 2, 3, 5 };
var q =
from x in list
join y in list on x + 1 equals y into y
from z in y.DefaultIfEmpty()
where z == 0
select x + 1
;
foreach (var item in q)
Console.WriteLine(item);
Печать 4
а также 6
просто игнорируйте последнее, поскольку оно всегда будет там, и нет простого способа предотвратить это без использования оконных функций, которые не поддерживаются в SQL Compact.
- Вы можете делать объединения в Linq
- Так как мне кажется, что вы пытаетесь решить проблему целостности БД низкого уровня, я бы вас вызвал.