繁体   English   中英

Linq 中的查询性能问题

Query Performance Issue in Linq

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我尝试了一个查询来从 db 中获取数据,但是当我使用添加以下子查询时会花费很多时间,它会从 db 中获取所有数据,然后再次使用子查询从 memory 中获取更多数据。

我还尝试加入响应表以仅获取所需的数据,但这仍然没有解决性能问题。

以下是导致性能问题的行:

projectType= internshipNameResponses.FirstOrDefault(y => y.QuestionID == 22).Answer,
additionalCriteria = internshipNameResponses.FirstOrDefault(y => y.QuestionID == 27).Answer,
tamidStudent = internshipNameResponses.FirstOrDefault(y => y.QuestionID == 28).Answer,
studentEmail = internshipNameResponses.FirstOrDefault(y => y.QuestionID == 2134).Answer,
jobDesc = internshipNameResponses.Where(y => y.QuestionID == 17).Select(x => x.Answer).ToList(),
experience = internshipNameResponses.Where(y => y.QuestionID == 21).Select(x => x.Answer).ToList(),
VCF = internshipNameResponses.Where(y => y.QuestionID == 4239).Select(x => x.AnswerCode).ToList(),
lang = internshipNameResponses.Where(y => y.QuestionID == 23).Select(x => x.Answer).ToList(),
codingLang = internshipNameResponses.Where(y => y.QuestionID == 24).Select(x => x.Answer).ToList(),
academic = internshipNameResponses.Where(y => y.QuestionID == 25).Select(x => x.Answer).ToList(),
HPD = internshipNameResponses.FirstOrDefault(y => y.QuestionID == 26).Answer,

这是完整的查询:

var result = (from cr in CompanyRepresentatives.Where(x=> companyIds.Contains(x.ID) )
    join p in QuestionnaireResponses on cr.ID equals p.RespondentID
    join q in Responses on p.ID equals q.QuestionnaireResponseID into internshipNameResponses
    join x in Responses on p.ID equals x.QuestionnaireResponseID into posibleAnswerResponses
    from internshipNameRes in internshipNameResponses
    from possibleAnsRes in posibleAnswerResponses
    where internshipNameRes.QuestionID == 2130 &&
        possibleAnsRes.QuestionID == 29 &&
        p.QuestionnaireID == 2 &&
          
        cr.Active == true &&

          //Applying the name filter
          (string.IsNullOrEmpty(companyOrInternshipName) || cr.CompanyName.ToLower().Contains(companyOrInternshipName) ||
          (internshipNameRes != null && internshipNameRes.Answer.ToLower().Contains(companyOrInternshipName))) &&

          //Applying the status filter
          

          //Applying the year filter
          
          //applying the active filter
          (includeHidden || !p.IsHidden)
    orderby cr.CompanyName
    select new 
    {
        ID = p.ID,
        Name = internshipNameRes.Answer,
        CompanyID = cr.ID,
        Company = cr.CompanyName,
        CompanyEmail = cr.Email,
        CompanyDesc = cr.CompanyDescription,
        usOfficeCity = cr.USOffice_City,
        isrOfficeoth = cr.IsraelOffice_City_Other,
        CompanyRank = cr.Rank,
        projectType= internshipNameResponses.FirstOrDefault(y => y.QuestionID == 22).Answer,
        additionalCriteria = internshipNameResponses.FirstOrDefault(y => y.QuestionID == 27).Answer,
        tamidStudent = internshipNameResponses.FirstOrDefault(y => y.QuestionID == 28).Answer,
        studentEmail = internshipNameResponses.FirstOrDefault(y => y.QuestionID == 2134).Answer,
        AvailablePositions = possibleAnsRes.Answer,
        FilledPositions = p.FilledVacancies,
        Status = p.Status,
        Visible = !p.IsHidden,
        DatePosted = p.Created,
        Rejected = p.IsInternshipRejected,
        jobDesc = internshipNameResponses.Where(y => y.QuestionID == 17).Select(x => x.Answer).ToList(),
        experience = internshipNameResponses.Where(y => y.QuestionID == 21).Select(x => x.Answer).ToList(),
        VCF = internshipNameResponses.Where(y => y.QuestionID == 4239).Select(x => x.AnswerCode).ToList(),
        lang = internshipNameResponses.Where(y => y.QuestionID == 23).Select(x => x.Answer).ToList(),
        codingLang = internshipNameResponses.Where(y => y.QuestionID == 24).Select(x => x.Answer).ToList(),
        academic = internshipNameResponses.Where(y => y.QuestionID == 25).Select(x => x.Answer).ToList(),
        HPD = internshipNameResponses.FirstOrDefault(y => y.QuestionID == 26).Answer,
        industry = cr.CompanyIndustry,
        companySize = cr.CompanySize,
        usOffice = cr.USOffice_City,
        isrOffice = cr.IsraelOffice_City,
        companyType = cr.CompanyType,
        market = cr.CompanyTargetMarket,
        financingStage = cr.FinancingStage
    }).ToList();
1 个回复

首先,我建议不要使用FirstOrDefault (在这种情况下返回null ,如果没有匹配项),因为您没有在此处处理null值。 而是使用 function First ,这将为您提供更好的错误描述。

您可以单步执行代码并准确查看导致问题的行(它会告诉您每行之后的时间)。 当您 go 经常通过表格internshipNameResponses名称响应时,我建议您只检查一次并过滤它,然后使用过滤后的表格:

var questionIDs = new []{17, 21, 22, 23, 24, 25, 26, 27, 28, 2134, 4239};
var filteredResponses = internshipNameResponses.Where(y => questionIDs.Contains(y.QuestionID)).ToList();

projectType = filteredResponses.FirstOrDefault(y => y.QuestionID == 22).Answer;
additionalCriteria = filteredResponses.FirstOrDefault(y => y.QuestionID == 27).Answer;
tamidStudent = filteredResponses.FirstOrDefault(y => y.QuestionID == 28).Answer;
studentEmail = filteredResponses.FirstOrDefault(y => y.QuestionID == 2134).Answer;
jobDesc = filteredResponses.Where(y => y.QuestionID == 17).Select(x => x.Answer).ToList();
experience = filteredResponses.Where(y => y.QuestionID == 21).Select(x => x.Answer).ToList();
VCF = filteredResponses.Where(y => y.QuestionID == 4239).Select(x => x.AnswerCode).ToList();
lang = filteredResponses.Where(y => y.QuestionID == 23).Select(x => x.Answer).ToList();
codingLang = filteredResponses.Where(y => y.QuestionID == 24).Select(x => x.Answer).ToList();
academic = filteredResponses.Where(y => y.QuestionID == 25).Select(x => x.Answer).ToList();
HPD = filteredResponses.FirstOrDefault(y => y.QuestionID == 26).Answer;

您会看到,尽管以这种方式从表中获取更多数据,但一次完成所有操作而不是 10 个单独的查询可以节省大量时间。

1 linq 查询中的性能问题

我创建了一个 linq 查询来连接表并执行聚合函数,它需要一分钟多的时间,并且在数据库中执行查询时会影响性能,需要 18 秒请帮助我提高 Linq 查询的性能。 代码: List<int> oStatus = new List<int> { (int)STATUS.PAID ...

2 LINQ查询的性能问题

我有一个从目录中获取文件列表的功能,然后从列表中搜索文件名以查找匹配项。 表演糟透了。 这是函数: 一旦到达提供“ matchingFiles”值的linq查询,它就会挂起。 这带有大量的“ permitNumbers”(如5000)和大量的“文件”。 我有什么办法可以加 ...

3 LINQ查询性能问题

我在方法语法中有以下LINQ表达式 我发现当ToList的调用花了很长时间,我想知道是否有什么我做错了导致性能下降。 我此时只运行ToList作为测试,但只需要几秒钟就可以返回大约7000条记录。 我怎样才能改善这个? ...

4 Linq编译查询和性能问题

我遇到了linq编译查询的一些性能问题。 我在这里附加了我的整个代码,请检查这是什么问题,它花了很长时间才能响应大约20秒。 主要是foreach循环播放超过17秒。 请让我知道如何编译此查询。 提前致谢。 ...

5 LINQ to xml查询出现性能问题

我已经将此LINQ编写为xml查询: 但是此代码大约需要5秒钟才能执行。 当然,我会更改查询,但是在调试中我已经看到该行 昏暗q =来自... 需要执行一个指令,随后的每一行都很快消失,直到“ For Each”循环完成了要滚动的项目并不得不退出为止。 然后执行停止5秒钟 ...

6 Linq查询的性能问题-归咎于导航属性?

我有一个Linq查询,它花的时间远远超过它的SQL等效查询(Linq大约5-6秒,SQL 50毫秒)。 显然翻译中出现了问题,我什至知道一个问题,但是我不知道如何解决。 查询如下: 我怀疑在我的组中使用导航属性User导致对CoacheeData中的每个记录执行子查询。 通过手动连 ...

9 性能问题:Sql Views与Linq减少查询执行时间

我在ASP.NET Webforms中具有系统设置程序,并且在某些特定情况下有“帐户记录生成”表单,我需要提取接近100万的所有记录。 一种解决方案可能是减少要提取的记录数量,但是当我们需要提取5年以上的记录时,时间记录分别是50万,100万等。如何减少其时间? 我可以用来减少时间的 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM