IEnumerable.Contains()不断查询数据源而不是内存

ash*_*duh 0 c# linq

我有以下代码尝试在1000-10000之间找到一个可以分配给userId的新唯一值.我这样做是通过查询所有userIds的DB并找到第一个未使用的用户ID:

    var users = userDbContext.Data.Select(a => a.UserId);

    for (int i = 1000; i < 10000; i++)
    {
        if (!users.Contains(i))
        {
            this.Id = i;
            break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,此循环的每次迭代都在查询数据库表,而不仅仅是查询内存中的内容.不知道怎么解决这个问题?

Luc*_*ski 10

将指针悬停在var关键字上,你会发现它仍然是一个IQueryable<int>.

您应该将其转换为集合以在内存中处理它,如下所示:

var users = userDbContext.Data.Select(a => a.UserId).ToList();
Run Code Online (Sandbox Code Playgroud)

.ToList() 将枚举查询,它将执行它.

但是你可以做的更好:因为你大多采用Contains,使用HashSet它是一个O(1)操作:

var users = new HashSet<int>(userDbContext.Data.Select(a => a.UserId));
Run Code Online (Sandbox Code Playgroud)