2011-03-29 58 views
0
// Loop each users profile 
using (DataClassesDataContext db = new DataClassesDataContext()) 
{ 
    var q = (from P in db.tblProfiles orderby P.UserID descending select new { LastUpdated = P.ProfileLastUpdated, UserID = P.UserID }).ToList(); 
    foreach(var Rec in q){ 
     string Username = db.tblForumAuthors.SingleOrDefault(author => author.Author_ID == Rec.UserID).Username; 
     AddURL(("Users/" + Rec.UserID + "/" + Username), Rec.LastUpdated.Value, ChangeFrequency.daily, 0.4); 
    } 
} 

這是爲我的站點地圖打印系統上每個用戶配置文件的URL。但是,假設我們有20,000個用戶,用戶名查詢是否會顯着減緩這種情況?Linq加入效率問題

我習慣於在SQL查詢中進行連接,但將它與主查詢分開,並且在循環中看起來好像效率很低,除非編譯得很好。

+0

對它調用'ToList()'會不必要地降低它的速度。因爲您只是通過集合進行枚舉,所以不需要在那裏。它將受益於使用實際的連接,因爲它不會在本地運行,而是在服務器上運行。 – 2011-03-29 18:59:15

回答

3

它可能會難以忍受的緩慢。在你的情況下,這將向數據庫發出20,000個獨立的SQL查詢。由於查詢同步運行,因此每次迭代都會導致服務器通信開銷。延遲將會相當快地累積。

與加入一起去。

from P in db.tblProfiles 
join A in db.tblForumAuthors on P.UserID equals A.Author_ID 
orderby P.UserID descending 
select new { LastUpdated = P.ProfileLastUpdated, UserID = P.UserID, Username = A.Username }; 

順便說一句,SingleOrDefault(...).Username如果author缺少將拋出一個NullReferenceException。更好地使用Single()或檢查你的邏輯。

+0

謝謝,你能告訴我怎麼做加入嗎? – 2011-03-29 19:27:29

+0

添加了所需的LINQ連接。您可以使用此手動加入,或者使用George Polevoy的解決方案。不過,我更喜歡他的。 – 2011-03-29 20:03:47

1

如果您在設計DataContext時在數據庫中正確設置了常量,則設計人員應該在Profile和Author類中生成一對一的成員。 如果沒有,您可以在設計器中手動完成。 然後你將能夠做到這樣的事情:

var q = 
from profile in db.tblProfiles 
order by profile.UserID descending 
select new { 
    LastUpdated = profile.ProfileLastUpdated, 
    profile.UserID, 
    profile.Author.Username 
}; 
0

加入!

保護您免受不必要的數據庫訪問,加入並獲得您需要的一切!