我有一个如下控制器,加载数据需要太长时间。我正在使用contains和tolist()方法。我听说过toList()方法的低性能。
如何通过更好的性能编码来改变这种方法。
public List<decimal> GetOrgSolution()
{
//Need to use USER id. but we have EMPNO in session.
var Users = db.CRM_USERS.Where(c => c.ID == SessionCurrentUser.ID || RelOrgPerson.Contains(c.EMPNO.Value)).Select(c => c.ID);
//Get the organization list regarding to HR organization
var OrgList = db.CRM_SOLUTION_ORG.Where(c => c.USER_ID == SessionCurrentUser.ID || Users.Contains(c.USER_ID.Value)).Select(c => c.ID).ToList();
//Get related solutions ID with the OrgList
List<decimal> SolutionList = db.CRM_SOLUTION_OWNER.Where(p => OrgList.Contains(p.SOLUTION_ORG_ID.Value)).Select(c => (decimal)c.SOLUTION_ID).Distinct().ToList();
return SolutionList;
}
答案 0 :(得分:3)
您可以通过从orglist查询中删除ToList()
来加快速度。这使用延迟执行,而不是拉动组织列表的所有记录。但是,如果调用Contains()
的查询不匹配,则仍需要加载所有内容。
public List<decimal> GetOrgSolution()
{
//Need to use USER id. but we have EMPNO in session.
var Users = db.CRM_USERS.Where(c => c.ID == SessionCurrentUser.ID || RelOrgPerson.Contains(c.EMPNO.Value)).Select(c => c.ID);
//Get the organization list regarding to HR organization
var OrgList = db.CRM_SOLUTION_ORG.Where(c => c.USER_ID == SessionCurrentUser.ID || Users.Contains(c.USER_ID.Value)).Select(c => c.ID);
//Get related solutions ID with the OrgList
List<decimal> SolutionList = db.CRM_SOLUTION_OWNER.Where(p => OrgList.Contains(p.SOLUTION_ORG_ID.Value)).Select(c => (decimal)c.SOLUTION_ID).Distinct().ToList();
return SolutionList;
}
答案 1 :(得分:2)
除非您使用的列表非常庞大,否则调用ToList
是代码中的主要瓶颈的可能性极小。我更倾向于怀疑数据库(假设您正在进行LINQ-to-SQL)。或者,您的嵌入式Contains
来电。例如,你有:
db.CRM_SOLUTION_ORG..Where(
c => c.USER_ID == SessionCurrentUser.ID || Users.Contains(c.USER_ID.Value))
因此,对于db.CRM_SOLUTION_ORG
中未通过SessionCurrentUser
测试的每个项目,您将对Users
列表进行顺序搜索。
考虑一下,因为Users
被懒惰地评估,每次调用Users
时,你都会执行Users.Contains
查询。如果您在ToList()
上调用Users
,看起来您的代码在这种情况下效率会更高。这样查询只执行一次。
您可能应该ToList()
查询OrgList
。否则,每次拨打OrgList.Contains
时,您都会重新执行该查询。
也就是说,如果Users
或OrgList
可能包含很多项目,那么最好将它们转换为HashSet
s以便获得O(1)查找而不是O(n)查找。
但是看看你的代码,看起来你应该能够通过使用连接的单个查询完成所有这些,并让数据库服务器来处理它。我不太清楚Linq to SQL或你的数据模型是否可以肯定地说,但是我站在那里看起来确实看起来像三个表的简单连接。