Linq加入效率问题

时间:2011-03-29 18:55:15

标签: c# linq performance

// 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查询中加入,但是将它与主查询分开并在循环中看起来似乎效率低,除非它编译好。

3 个答案:

答案 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(...).Usernameauthor将抛出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)

加入!

免于不必要的数据库访问,加入并一次性获得所需的一切!