我的一个小型数据库管理项目(用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);
答案 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();
答案 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