我有一个相当复杂的搜索系统,它获取一系列匹配课程,然后显示一个过滤器列表(职业路径),其中包含每个过滤器选项的课程数量。在我获得搜索结果列表之后,我会查询以获得职业路径列表以及有多少课程具有该职业发展路径(一门课程可以有多个职业路径,课程可以通过CourseVersionId或CourseInfoId(声音)与职业路径相关联奇怪,但有一个原因)。我现在无法真正改变数据库结构,所以我只是在寻找改进此查询的方法。
如果有很多搜索结果(1200),那么由于我的查询的两个包含部分,我达到2100参数限制。我可以通过将结果限制为1000来避免这个问题,但我希望有更好的方法来进行此查询。
tbCareerPath是我的职业路径列表,我将完整列表(大约50个)缓存在内存中以保存查找。
tbCourseCareerPath是我的查找表,其中包含通过CourseVersionId或CourseInfoId关联课程的字段(因此两个包含)。
courseResults是我的搜索结果列表,可能是最多约1500个结果(不寻常但发生)。
这是我的查询,以获得在搜索结果中有课程的职业道路,以及课程数量:
var q2 = from careerPath in tbCareerPath.Cache()
let courseCount =
(
from courseCareerPath in dc.tbCourseCareerPaths
where courseCareerPath.CareerPathId == careerPath.CareerPathId &&
((from course in courseResults
select (int?)course.Course.CourseVersionId).Contains(courseCareerPath.CourseVersionId) ||
(from course in courseResults
select (int?)course.Course.CourseInfoId).Contains(courseCareerPath.CourseInfoId))
select courseCareerPath
).Count()
where courseCount > 0
orderby courseCount descending, careerPath.CareerPathTitle ascending
select new Filter()
{
Id = careerPath.CareerPathId,
Title = careerPath.CareerPathTitle,
RecordCount = courseCount
};