2015-10-16 57 views
0

我有以下代碼嘗試並找到一個新的唯一值1000-10000之間,我可以分配給一個userId。我這樣做,通過查詢數據庫爲所有的用戶id和找到第一個未使用的一個:IEnumerable.Contains()保留查詢數據源而不是內存

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

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

出於某種原因,這個循環的每次迭代查詢的數據庫表,而不是僅僅詢問什麼是在內存中。任何想法如何解決這個問題?

+5

請記住,查詢是*問題*,而不是*答案*。你說「問數據庫這個問題九千次」,這就是你得到的。 –

回答

10

將指針懸停在關鍵字var上,您將看到它仍然是IQueryable<int>

你應該把它變成一個集合的內存來處理它,就像這樣:

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

.ToList()將枚舉在可查詢的,將執行它。

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

var users = new HashSet<int>(userDbContext.Data.Select(a => a.UserId)); 
1

如果調用ToList()或類似的東西來執行數據將在內存中查詢。

linq查詢實際上並沒有執行,直到它需要。