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

时间:2015-10-16 18:13:26

标签: 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;
        }
    }

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

2 个答案:

答案 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查询实际上并未执行。