C# 找到第一个免费id

C# 找到第一个免费id,c#,sql,linq,C#,Sql,Linq,我的一个小型数据库管理项目(用delphi编写)使用sql查询查找mysql表的第一个空闲id 示例:我必须在如下表中找到第一个可用id(孔): | id | Col1| |------|------| |5101 | ABC| |5102 | BCD| |5103 | CDE| |5105 | EFG |来自: 基本上,按顺序排列。然后创建一个序列号数组(1,2,3…),从最小值一直到最大值。检查列表中是否缺少值,然后获取第一个。这是第一个丢失的号码。来自: 基本上,按顺序排列。然后创建一个序

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

示例:我必须在如下表中找到第一个可用id(孔):

| id | Col1|
|------|------|
|5101 | ABC|
|5102 | BCD|
|5103 | CDE|
|5105 | EFG |来自:

基本上,按顺序排列。然后创建一个序列号数组(
1,2,3…
),从最小值一直到最大值。检查列表中是否缺少值,然后获取第一个。这是第一个丢失的号码。

来自:


基本上,按顺序排列。然后创建一个序列号数组(
1,2,3…
),从最小值一直到最大值。检查列表中是否缺少值,然后获取第一个。这是第一个缺失的数字。

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

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();
var nums=(新列表(){1,2,3,25,4,5,6,7,8,12,15,21,22,23});
努姆斯
.OrderBy(x=>x)
.GroupJoin(nums,n=>n+1,ni=>ni,(o,i)=>new{o,i})
.其中(t=>!(t.i是i分组))
.Dump();

这可以为您提供表格中的所有间隙

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();
var nums=(新列表(){1,2,3,25,4,5,6,7,8,12,15,21,22,23});
努姆斯
.OrderBy(x=>x)
.GroupJoin(nums,n=>n+1,ni=>ni,(o,i)=>new{o,i})
.其中(t=>!(t.i是i分组))
.Dump();
另一种方法(与您现在使用的方法类似)。
假设您有一个整数数组(或其他类型的集合),如下所示:

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

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

int result = myIDs.Where((n, i) => (i < myIDs.Length - 1) && (n + 1 < myIDs[i + 1])).FirstOrDefault();
result = result == default ? myIDs.Last() + 1 : result;
另一种方法(与您现在使用的方法类似)。
假设您有一个整数数组(或其他类型的集合),如下所示:

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

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

int result = myIDs.Where((n, i) => (i < myIDs.Length - 1) && (n + 1 < myIDs[i + 1])).FirstOrDefault();
result = result == default ? myIDs.Last() + 1 : result;


但是您需要它来添加具有这样值的行吗?或者出于其他目的?如果您使用DB生成的ID,我必须填写空行。只需添加结果,直到达到所需的ID。这听起来像是一个X/Y问题。通常不重用数据库ID。要使这种并发安全是不可能的。您的Db是一次性使用的吗?您使用哪种类型的LINQ?正如您在答案中所看到的,人们很容易认为您可以在内存中完成这一切,但我很确定您希望数据库像SQL语句一样完成繁重的工作。但是您需要它来添加一行这样的值吗?或者出于其他目的?如果您使用DB生成的ID,我必须填写空行。只需添加结果,直到达到所需的ID。这听起来像是一个X/Y问题。通常不重用数据库ID。要使这种并发安全是不可能的。您的Db是一次性使用的吗?您使用哪种类型的LINQ?正如您在答案中所看到的,人们很容易认为您可以在内存中完成这一切,但我很确定您希望数据库像SQL语句一样完成繁重的工作。请再次检查我的答案。我添加了.Net Fiddle链接,确切的错误是什么?你能说出准确的错误吗?不要编辑我的答案,请编辑你的问题并添加你的尝试。请再次检查我的答案。我添加了.Net Fiddle链接,确切的错误是什么?你能说出准确的错误吗?请编辑您的问题并添加您的尝试,而不是编辑我的答案。操作将使用dbContext。这种方法意味着他需要在内存中加载所有内容,然后执行它。这对大公司不起作用data@Simonare你确定吗?我看不出这是怎么描述的。我刚刚看到convert to C#LINQ表达式。我仔细检查了它,似乎我认为它是因为SQL。很抱歉:)@Simonare好吧,可能正如你所说。背景并不那么清楚。也许,OP会更好地定义它,看到这些评论。@Jimi我听从了你的建议,并更好地解释了它(我希望)OP使用的是dbContext。这种方法意味着他需要在内存中加载所有内容,然后执行它。这对大公司不起作用data@Simonare你确定吗?我看不出这是怎么描述的。我刚刚看到convert to C#LINQ表达式。我仔细检查了它,似乎我认为它是因为SQL。很抱歉:)@Simonare好吧,可能正如你所说。背景并不那么清楚。也许,OP会更好地定义这些评论。@Jimi我听从了你的建议,并且解释得更好(我希望)