Linq声明返回下一个ID

时间:2013-04-21 03:55:00

标签: c# linq list

我的Books列表的PK为Id,部分Books可能会被删除。 例如,包含此Id的列表:

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;
    }

如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

我立刻注意到的一件事是,这永远不会成真:

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

如果找不到匹配项,Where调用将返回一个空的枚举。从那里开始。

请改为尝试:

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

答案 1 :(得分:2)

如果你有大量的书籍,你可能无法将它们全部记在内存中。而你当然不希望对它们进行循环,并在其中再次迭代它们的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;
}

答案 2 :(得分:1)

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

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