2011-03-29 60 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

加入!

保护您免受不必要的数据库访问,加入并获得您需要的一切!