0

有时当我使用 LINQ 编写查询时,如果我在循环中使用它。它变得如此缓慢的性能。

        var query1 = from c in db.Classes
                     where c.TeacherId.Equals(teacherId)
                     select c;

        // AnsweredAssignment Query
        var query2 = (from c in db.AnsweredAssignments
                      where c.AssignmentId == assignmentId && c.Student.Class.TeacherId.Equals(teacherId)
                      select c).ToArray();

        // Tokens Query
        var query3 = (from c in db.Tokens
                      where c.AssignmentId == assignmentId && c.Student.Class.TeacherId.Equals(teacherId)
                      select c).ToArray();

        // OverwrittenScores Query
        var query4 = (from os in db.OverwrittenScores
                      where os.AssignmentId == assignmentId && os.Student.Class.TeacherId.Equals(teacherId)
                      select os).ToArray();



        foreach (var c in query1)
        {
            foreach (var s in c.Students)
            {
                var aaItems = (from aa in query2
                               where aa.StudentId == s.StudentId
                               select aa).ToArray();


                // Generate scores for objectives
                var id3 = (from aa in aaItems 
                           where !aa.IsMakeup
                           orderby aa.Score descending
                           select aa).FirstOrDefault();

                if (id3 != null)
                {
                    var aa3 = (from aa in query2
                               where aa.AnsweredAssignmentId == id3.AnsweredAssignmentId
                               select aa).SingleOrDefault();
                    ...
                }


                var tokens = (from t in query3
                              where t.StudentId == s.StudentId
                              select new MonitorByGeneralScoreToAnsweredAssignment(AssignmentStatus.Pending)).ToList();

                ...


                // does exist any overwritten score?
                var osItem = query4.Where(os => os.StudentId == s.StudentId).SingleOrDefault();

                ...
            }

        // OverwrittenScores Query
        var query4 = (from os in db.OverwrittenScores
                      where os.AssignmentId == assignmentId && os.Student.Class.TeacherId.Equals(teacherId)
                      select os).ToArray();

我现在要做的是获取要使用的记录,而不是在循环中一一获取。这是一个好习惯吗?有时我想我做得不好:(

获得记录后,我将其保存到内存中并使用 LINQ TO OBJECTS(从内存中)进行记录。

4

1 回答 1

0

所以请记住,调用数据库总是很慢。事实上,它通常是大多数应用程序中最慢的部分。因此,您应该努力一次退回很多东西,而不是尝试一次获得一件物品。

努力重写您的查询,以便根据需要一次性返回尽可能多的所需信息。尽管您可能会使用更多内存,但为了节省时间,这通常是不值得的。连接数据库很慢!

其次,(最后我检查过)实体框架使用反射来设置对象的属性。反射也很慢,这就是为什么 - 尽管 EF 很酷 - 我仍然更喜欢手动进行查询。性能明显更快(但当然引入了另一层复杂性,因为现在您不仅要处理一种语言 - C# - 而是两种 - C# 和 SQL - 它们在概念上非常不同)。

于 2013-05-15T16:58:55.890 回答