我有以下代码尝试在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;
}
}
由于某种原因,此循环的每次迭代都在查询数据库表,而不仅仅是查询内存中的内容。知道如何解决这个问题吗?
答案 0 :(得分:10)
将指针悬停在var
关键字上,您会发现它仍然是IQueryable<int>
。
您应该将其转换为集合以在内存中处理它,如下所示:
var users = userDbContext.Data.Select(a => a.UserId).ToList();
.ToList()
将枚举查询,它将执行它。
但是您可以做得更好:因为您主要使用Contains
,所以请使用HashSet
O(1)操作:< / p>
var users = new HashSet<int>(userDbContext.Data.Select(a => a.UserId));
答案 1 :(得分:1)
如果你调用ToList()或类似的东西来执行查询,数据将在内存中。
在需要之前,linq查询实际上并未执行。