// 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个用户,用户名查询会显着降低这个速度吗?
我习惯在SQL查询中加入,但是将它与主查询分开并在循环中看起来似乎效率低,除非它编译好。
答案 0 :(得分: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()
或检查您的逻辑。
答案 1 :(得分:1)
如果在设计DataContext时在数据库中正确设置了constranints,则设计人员应在Profile和Author类中生成一对一的成员。 如果没有,您可以在设计器中手动完成。 然后你就可以做到这样的事情:
var q =
from profile in db.tblProfiles
order by profile.UserID descending
select new {
LastUpdated = profile.ProfileLastUpdated,
profile.UserID,
profile.Author.Username
};
答案 2 :(得分:0)
加入!
免于不必要的数据库访问,加入并一次性获得所需的一切!