用于返回下一个ID的Linq语句

本文关键字:Linq 语句 ID 返回 下一个 用于 | 更新日期: 2023-09-27 18:10:07

我有Books的列表,Id的PK, Books的一些可能被删除。例如,包含以下Id s的列表:

1 2 5 6 8

现在我需要一个linq语句来返回下一个插入Id(在示例中为"3")

我试过这个代码,但它总是return "1":

 public int GetNextRecordId()
    {
        List<Book> books = getAll();
        int counted = books.Count();
        foreach (Book b in books)
        {
            if (books.Where(book => book.Id == (b.Id + 1)) == null)
                return b.Id + 1;
        }
        return 1;
    }

如何解决这个问题?

用于返回下一个ID的Linq语句

我马上注意到的一件事是,这永远不会是真的:

books.Where(book => book.Id == (b.Id + 1)) == null

Where调用如果没有找到匹配,则返回一个空枚举对象。从这里开始。

试试这个:

!books.Where(book => book.Id == (b.Id + 1)).Any()

如果你有很多书,你可能不可能像那样把它们都储存在内存中。你肯定不想在它们上面做一个循环,里面有一个Where子句,再次对它们进行迭代。您最好按顺序阅读它们以寻找像这样的空白:-

public int GetNextRecordId()
{
    // Cannot load all books into memory ...
    IEnumerable<Book> books = dataContext.Books.OrderBy(b => b.Id);
    int index = 0;
    foreach (var book in books)
    {
      index++;
      if (index < book.Id) return index;
    }
    return index;
}

我建议这个linq查询,如果这个查询运行在linq到实体上,查询的成本非常低:

var id = books.Select(p => p.Id  + 1).Except(books.Select(p=>p.Id)).First();