Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架中的性能_C#_Asp.net Mvc_Entity Framework_Linq To Sql_Entity Framework 5 - Fatal编程技术网

C# 实体框架中的性能

C# 实体框架中的性能,c#,asp.net-mvc,entity-framework,linq-to-sql,entity-framework-5,C#,Asp.net Mvc,Entity Framework,Linq To Sql,Entity Framework 5,有时,当我使用LINQ编写查询时,如果我在循环中使用它。它的速度太慢了 var query1 = from c in db.Classes where c.TeacherId.Equals(teacherId) select c; // AnsweredAssignment Query var query2 = (from c in db.AnsweredAssi

有时,当我使用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对对象(从内存中)执行操作我开始记录。

所以请记住,调用数据库总是很慢的。事实上,这通常是大多数应用程序中最慢的部分。因此,您应该努力一次返回大量内容,而不是一次只获取一个项目

努力重写查询,以便一次返回所需的信息。虽然您可能会占用更多内存,但为了节省时间,这往往是不值得的。连接到数据库的速度很慢

第二,(上次我检查)实体框架使用反射来设置对象的属性。反射也非常慢,这就是为什么尽管EFs很酷,我仍然喜欢手工查询。性能明显更快(当然,这会带来另一层复杂性,因为现在您不仅要处理一种语言—C,而且要处理两种—C和SQL—这两种语言在概念上非常不同)