2012-07-11 81 views
0

我正在寫一段代碼與linq必須散列一個字符串(在這種情況下,我的登錄),然後嘗試找到它到我的數據庫。哈希登錄,然後用LINQ搜索

我想:

var userFind = context.Users.FirstOrDefault(user =>HashHelper.HashCode(user.Login).Equals(u.Login)); 

我因爲的hashCode錯誤。 我不會用foreach閱讀我的所有列表。我想知道是否可以用一行代碼來完成。 此致敬禮。

編輯:我找到了一個辦法,但它沒有我想象的那麼輕。

User userFind = null; 
      foreach (var user in context.Users) 
      { 
       string hashedLogin = HashHelper.HashCode(user.Login); 
       if(hashedLogin.Equals(u.Login)) 
       { 
        userFind = user; 
       } 
      } 
+0

什麼是'u.Login',爲什麼要從數據庫中散列值? – Jodrell 2012-07-11 09:28:03

+0

啊,我看到了,所以'u.Login'是一個你想匹配的哈希登錄。非哈希登錄存儲在數據庫中。您遇到的問題是'HashHelper.HashCode'沒有明顯的TSQL翻譯,因此任何ORM都無法將其轉換爲SQL。這是正確的嗎? – Jodrell 2012-07-11 09:59:55

+1

您的編輯會將所有用戶拉到客戶端,並執行可以評估「HashHelper.HashCode」的比較。如果你沒有很多用戶(1000+左右),這可能是最簡單的解決方案。 – Jodrell 2012-07-11 10:10:42

回答

1

如果你沒有太多的用戶,你可以在一行這樣做。

var userFind = context.Users.ToList().FirstOrDefault(
    user => HashHelper.HashCode(user.Login).Equals(u.Login)) 

最重要的一點是評估EF部分,使其餘的LINQ到對象ToList()。這意味着比較將在客戶端完成,所有用戶將從服務器中檢索。它相當於你的編輯。

如果性能問題,您應該將哈希碼存儲在數據庫中。

0

如果在數據庫中的數據已經被散列和u.Login是當前用戶的登錄的價值,那麼你也許可以做這樣的:

var hashedLogin = HashHelper.HashCode(u.Login); // hash the value in the app so it can be compared to already hashed values in database. 
var userFind = context.Users.Where(user => user.Login == hashedLogin).FirstOrDefault(); 

我真的不非常瞭解你想要達到的目標,所以如果真的有幫助,我會很驚喜。祝你好運!