Найти отверстие в последовательности, используя 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.

  1. Вы можете делать объединения в Linq
  2. Так как мне кажется, что вы пытаетесь решить проблему целостности БД низкого уровня, я бы вас вызвал.
Другие вопросы по тегам