在MVC4中过滤Linq

时间:2016-06-07 06:19:20

标签: linq asp.net-mvc-4

我的表格结构如下

课程

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

我如何实现上述结果

2 个答案:

答案 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

否则我不明白你的问题。