C# 实体框架中的性能
有时,当我使用LINQ编写查询时,如果我在循环中使用它。它的速度太慢了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
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—这两种语言在概念上非常不同)