我的表格结构如下
课程
ID CourseName
1 PHP
2 WORDPRESS
MainCourse
ID MainCourseName
1 FoundationPhp
2 FoundationWordPress
3 Diploma
SubCourse
ID MainCourseID CourseID
1 1 1
2 2 2
3 3 1
3 3 2
我有一个搜索方案应该获取以下结果
当用户单独搜索PHP
时,他应该得到以下结果
MainCourseName CourseCombination
FoundationPHP PHP
Diploma PHP,WORDPRESS
当用户单独搜索WORDPRESS
时,他应该得到以下结果
MainCourseName CourseCombination
FoundationWordPress WORDPRESS
Diploma PHP,WORDPRESS
当用户按PHP,WORDPRESS
搜索时,他应该得到以下结果。
MainCourseName CourseCombination
Diploma PHP,WORDPRESS
注意:如果还有任何其他组合同时包含PHP & WORDPRESS
,那么这种组合的示例就像PHP,WORDPRESS,JAVA
。
我尝试过以下方法
List<int> CourseId={1,2}//means user searches by both PHP & WORDPRESS
var courseList = _db.SubCourses
.AsEnumerable()
.Where(mcd => courseId.Contains(mcd.Course.Id))
.Select(mc => new RegistraionVM.clsCourseCodeSearch
{
CourseCode = mc.MainCourse.MainCourseName,
CourseCombination = string.Join(",", mc.MainCourse.SubCourse
.Select(mcd => mcd.Course.Name))
}).Distinct().Take(5).ToList();
以上查询返回以下结果
MainCourseName CourseCombination
FoundationPHP PHP
FoundationWordPress WORDPRESS
Diploma PHP,WORDPRESS
期望的结果是
MainCourseName CourseCombination
Diploma PHP,WORDPRESS
我如何实现上述结果
答案 0 :(得分:2)
您需要首先按MainCourseID
分组,然后使用.All()
子句仅选择过滤器中包含所有结果子主题的项目
var filter = new int[] { 1 }; // or new int[] { 1, 2 } etc
var results = list.GroupBy(x => x.MainCourseID).Select(x => new
{
MainCourse = x.FirstOrDefault().MainCourse,
SubCourseIDs = x.Select(y => y.Course.ID),
SubCourseNames = x.Select(y => y.Course.CourseName)
}).Where(x => filter.All(y => x.SubCourseIDs.Contains(y))).Select(x => new RegistraionVM.clsCourseCodeSearch()
{
CourseCode = x.MainCourse.MainCourseName,
CourseCombination = String.Join(", ", x.SubCourseNames)
}).Take(5).ToList();
答案 1 :(得分:-1)
PHP = 1 MainCourse 1和3的课程PHP = 1 所以它应该说:
FoundationPhp PHP 文凭PHP,WORDPRESS
否则我不明白你的问题。