我有一个相当复杂的搜索系统,它获取匹配课程列表,然后显示过滤器列表(职业路径)以及每个过滤器选项的课程数量。在获得搜索结果列表后,我进行查询以获取职业路径列表以及有多少课程具有该职业路径(一个课程可以有多个职业路径,并且课程可以通过 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
};