繁体   English   中英

Linq 中的查询性能问题

[英]Query Performance Issue in Linq

我尝试了一个查询来从 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();

首先,我建议不要使用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 个单独的查询可以节省大量时间。

问题未解决?试试以下方法:

Linq 中的查询性能问题

暂无
暂无

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

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