性能的toList()方法的替代方法是什么。

时间:2014-04-25 19:55:29

标签: c# asp.net asp.net-mvc performance

我有一个如下控制器,加载数据需要太长时间。我正在使用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;
}

2 个答案:

答案 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时,您都会重新执行该查询。

也就是说,如果UsersOrgList可能包含很多项目,那么最好将它们转换为HashSet s以便获得O(1)查找而不是O(n)查找。

但是看看你的代码,看起来你应该能够通过使用连接的单个查询完成所有这些,并让数据库服务器来处理它。我不太清楚Linq to SQL或你的数据模型是否可以肯定地说,但是我站在那里看起来确实看起来像三个表的简单连接。