2011-08-26 81 views
1

由於某些奇怪的原因,即使將其作爲模型類型轉換,我也無法訪問此對象的屬性。有沒有人有一個想法,爲什麼? (這可能是顯而易見的,但我很新的C#所以請耐心等待!O))爲什麼我無法訪問我的對象模型的屬性?

Users currentUser = new Users();    
currentUser = (from x in db_tc.Users where x.Id == Convert.ToInt32(User.Identity.Name) select x); 

當我打電話currentUser,我只能夠訪問CRUD方法和List<Users>屬性調用usrList 。我沒有創建列表定義,所以我想這是自動創建的Entity框架的一部分。

我曾嘗試鑄造currentUser(Users)實體查詢之前,它根本沒有幫助。

+0

你爲什麼要這樣做'Convert.ToInt32(User.Identity.Name)'你的用戶名總是數字?或者,您的ID列是實際名稱,而不是標識列? – Jay

+0

@Jay這可能有點不方便,但USERS表中相應用戶的用戶ID當前被放置在User.Identity.Name中。我剛剛瞭解了身份驗證Cookie的'UserData'屬性,所以我將在不久的將來對其進行修改......我只是想先弄清楚這部分內容。謝謝你的幫助! – BobZavala

回答

8

這是因爲您只創建了查詢,您並未實際執行它。加入Single()(或First()等)來獲得結果:

var currentUser = (from x in db_tc.Users where x.Id == Convert.ToInt32(User.Identity.Name) select x).SingleOrDefault(); 
  • Single():獲取序列的第一個元素,但會拋出一個異常,如果沒有元素被發現如果序列具有更比一個元素。
  • First():獲取序列的第一個元素,但如果找不到元素將拋出異常。
  • SingleOrDefault() and FirstOrDefault():與上面相同,但將返回default(T)而不是拋出空序列。

LINQ的這種「延遲執行」方面可能是最難理解的部分。基本思想是,您可以使用查詢操作(Where()Select()等)構建查詢,然後可以使用其中一個非延遲執行操作(Single())執行該查詢以實際獲取其結果,ToList()等)

2

您在這裏的操作將返回數據庫將返回的匹配列表,它是一個集合。 如果您打算只返回單個記錄,則會在您的linq查詢的末尾追加.First();

而且刪除此行Users currentUser = new Users(); 並從「好LINQ做法」旅行車添加此var currentUser =...

0

一些更多的技巧......

LINQ應該「通常是」迴歸VAR,那麼您將轉換爲數據你期待的類型。我發現的另一個好的做法是立即驗證LINQ的返回結果,因爲任何沒有驗證的用法都是非常容易出錯的。例如:

var qUser = (from x in db.Users select x); 

if (qUser != null && currentUser.Count() > 0) 
{ 
    List<User> users = (List<User>)qUser.ToList(); 
    ... process users result ... 
} 

的不是null,數大於0檢查應需要每個LINQ查詢後。 ;)

並且不要忘記在try-catch中包裝SqlException!

+1

'qUser!= null'是不必要的。構造的查詢永遠不會爲空。我不確定我在這裏遵循你的建議。 – dlev

+0

真的嗎?所以在引用特定對象類型時首選匿名變量?如果可能的話,我的印象是你應該指定你要返回的對象的類型。例如'List objList =(從db_tc.Users中的u where u.ID == userID select u).ToList();'或甚至'Users qUser =(從db.Users中的x選擇x);' – BobZavala

+0

@Bob using處理LINQ時''var'方法*更容易;實際上有很多種不同的類型,很難讓它恰到好處。當然,如果你的查詢生成一個匿名類型,它實際上是必需的。 – dlev

相關問題