2016-06-07 68 views
3

我的表结构如下滤波中的LINQ在MVC4

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时,他应该得到以下结果LT。

MainCourseName   CourseCombination 
    Diploma     PHP,WORDPRESS 

注:如果是同时包含PHP & WORDPRESS应显示为一个这样的组合的well.Example会像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 

我怎样才能acheive上述结果

回答

2

您需要首先GROUPBY的MainCourseID,然后使用.All()条款只选择其中的所有结果subcourses包含在过滤项

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(); 
+0

这个答案,因为它只会返回'ID'值,而不是名称,因为它不清楚你投影结果的视图模型是什么 - 例如,如果过滤器是“{1,2}”,那么结果将是“MainCourseName:3,CourseCombination:”1,2“”。我可以修复它显示名称,一旦你的快乐,这将返回您所期望的值。 –

+0

Yeaaah ......得到了答案正确的队友。如果可能请修复它显示名称.. – ksg

+1

已更新答案。如果我已经正确地解释了你的模型,现在应该给你'CourseCode:“文凭”,CourseCombination:“PHP,WORDPRESS”'如果过滤器是'{1,2}' –

-1

PHP = 1 而MainCourse 1和3场PHP = 1 所以应该说:

FoundationPhp PHP 文凭PHP,WordPress的

不然我不明白你的问题。

+0

是没错,但如果用'PHP,WORDPRESS'用户搜索那么这两门课程的结合应该只是结果。“基础PHP”和“基础WORDPRESS”不会来。 – ksg