2010-01-23 78 views
0

作爲LINQ新手,我創建了幾個查詢,並希望將它們合併爲一個,但我不知道如何去做。在這裏,他們是:如何將這些linq查詢合併爲一個?

var u = dc.Users.Where(w => w.UserName == userName).SingleOrDefault(); 

var m = dc.Memberships.Where(w => w.UserId == u.UserId).SingleOrDefault(); 

m.PasswordQuestion = securityQuestion; 
m.PasswordAnswer = securityAnswer; 

dc.SubmitChanges(); 

dc.Usersaspnet_Users
dc.Membershipaspnet_Membership

而且,是什麼SingleOrDefaultFirstOrDefault之間的區別?

+0

你的第二個問題是重複的:http://stackoverflow.com/questions/1745691/linq-when-to-use-singleordefault-vs-firstordefault-with-filtering-criteria – 2010-01-23 00:17:07

回答

5

不知道他們是否有關係(他們應該)。如果他們這樣做了,那麼linq-to-sql設計器會給你一個成員對象的User屬性(或其他方式)。然後,你可以寫這樣的事情:

var membership = dc.Memberships.Where(x => x.User.UserName == userName).SingleOrDefault(); 

如果他們沒有關係,你可以寫這樣的事情:

var membership = (from m in dc.Membership join u in dc.Users on u.UserId equals m.UserId 
        where u.UserName == userName 
        select u).SingleOrDefault(); 

)的SingleOrDefault()和FirstOrDefault(之間的區別是的SingleOrDefault ()假定沒有多個匹配查詢的項目。如果兩個項目匹配查詢,則會拋出異常。而如果您使用FirstOrDefault()並且有兩個項目與查詢匹配,那麼將會選擇第一個項目。

1

如果您的序列包含多個元素,那麼SingleOrDefault將引發錯誤,而FirstOrDefault不會。在這種情況下,您可能需要FirstOrDefault,因爲用戶可以擁有多個成員資格。

var m = dc.MemberShips where(w => w.UserId.UserName == userName).FirstOrDefault(); 
3

的SingleOrDefault的意思是「如果沒有的元素,給我默認,如果有,給我吧,否則,拋出一個異常」。 FirstOrDefault表示「如果沒有元素,那麼給我默認值,否則給我第一個元素」。

至於你關於結合查詢的問題 - 你爲什麼?如果代碼運行良好,爲什麼改變它?

要回答一個您沒有問的問題:組合查詢的常用方法是使用查詢延續。一個常見的模式是:

var q1 = from y in something 
     somequeryclauses; 
var q2 = from x in q1 
     someotherquerqyclauses; 

你可以這樣寫一個大的這樣的查詢:

var q2 = from x in (from y in something 
        somequeryclauses) 
     someotherqueryclauses; 

它變得難以閱讀。您可以將這兩個查詢與查詢延續結合起來:

var q2 = from y in something 
     somequeryclauses 
     into x 
     someotherqueryclauses; 

有意義嗎?

1

我沒有在我面前的Visual Studio,但它會是這樣的:

var m = dc.Memberships.Where(w => w.Users.UserName == userName).SingleOrDefault(); 

m.PasswordQuestion = securityQuestion; 
m.PasswordAnswer = securityAnswer; 

dc.SubmitChanges(); 

w.Users讓你可以跟蹤會員和用戶表之間的外鍵鏈接。

如果返回多個結果,則SingleOrDefault將引發異常。 FirstOrDefault僅返回第一條記錄。

相關問題