[英]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 个单独的查询可以节省大量时间。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.