查找第一个免费ID

时间:2019-02-23 14:45:46

标签: c# sql linq

我的一个小型数据库管理项目(用delphi编写)使用sql查询来查找mysql表的第一个空闲ID。

示例:我必须在这样的表中找到第一个空闲的id(孔):

| id   | Col1 |
|------|------|
| 5101 | ABC  |
| 5102 | BCD  |
| 5103 | CDE  |
| 5105 | EFG  |  first missing id
| 5106 | GHI  |
| 5108 | ILM  |

代码应找到第一个空闲ID 5104

这是我在SQL中(在旧项目中)的处理方式:

SELECT
  MIN((doc.id + 1)) AS nextID
FROM (doc
  LEFT JOIN doc doc1
    ON (((doc.id + 1) = doc1.id)))
WHERE (ISNULL(doc1.id) AND (doc.id > 5000))

现在,我正在用C#语言重写,我需要将sql语句转换为LINQ查询(对于MySQL Entity Framework,它使用Devart dotConnect)。 从这里开始:

DC db = new DC();
var nums = db.Documentos.OrderBy(x => x.Id);

3 个答案:

答案 0 :(得分:0)

来自Can LINQ be used to find gaps in a sorted list?

var strings = new string[] { "7", "13", "8", "12", "10", "11", "14" };
var list = strings.OrderBy(s => int.Parse(s));
var result = Enumerable.Range(list.Min(), list.Count).Except(list).First(); // 9

基本上,订购列表。然后创建一个从最小到最大的序号数组(1,2,3...)。检查列表中缺少的值,然后获取第一个。那是第一个丢失的数字。

答案 1 :(得分:0)

这可以为您提供表格中的所有空白

var nums= (new List<int> (){1,2,3,25,4,5,6,7,8, 12, 15,21,22,23}).AsQueryable();

nums
  .OrderBy(x => x)
  .GroupJoin(nums, n=> n + 1, ni => ni, (o,i)=> new {o, i})
  .Where(t=> !(t.i is IGrouping<int, int>))
  .Dump();

.Net Fiddle

答案 2 :(得分:0)

另一种方法(类似于您现在使用的方法)。
假设您有一个整数数组(或其他类型的集合),如下所示:

Seek

如果尚未订购,请var myIDs = new int[] { 5101, 5113, 5102, 5103, 5110, 5104, 5105, 5116, 5106, 5107, 5108, 5112, 5114, 5115 };

OrderBy()

提取小于myIDs = myIDs.OrderBy(n => n).ToArray(); 的第一个数字:

(next number) + 1

如果该集合的成员都不满足该条件,请获取最后一个并添加int result = myIDs.Where((n, i) => (i < myIDs.Length - 1) && (n + 1 < myIDs[i + 1])).FirstOrDefault();

1