MVC4中Linq中的滤波
我的表格结构如下 课程MVC4中Linq中的滤波,linq,asp.net-mvc-4,Linq,Asp.net Mvc 4,我的表格结构如下 课程 ID CourseName 1 PHP 2 WORDPRESS ID MainCourseName 1 FoundationPhp 2 FoundationWordPress 3 Diploma ID MainCourseID CourseID 1 1 1 2 2 2 3
ID CourseName
1 PHP
2 WORDPRESS
ID MainCourseName
1 FoundationPhp
2 FoundationWordPress
3 Diploma
ID MainCourseID CourseID
1 1 1
2 2 2
3 3 1
3 3 2
MainCourse
ID CourseName
1 PHP
2 WORDPRESS
ID MainCourseName
1 FoundationPhp
2 FoundationWordPress
3 Diploma
ID MainCourseID CourseID
1 1 1
2 2 2
3 3 1
3 3 2
分课程
ID CourseName
1 PHP
2 WORDPRESS
ID MainCourseName
1 FoundationPhp
2 FoundationWordPress
3 Diploma
ID MainCourseID CourseID
1 1 1
2 2 2
3 3 1
3 3 2
我有一个搜索场景,应该得到以下结果
当用户单独通过PHP
进行搜索时,应该会得到以下结果
MainCourseName CourseCombination
FoundationPHP PHP
Diploma PHP,WORDPRESS
MainCourseName CourseCombination
FoundationWordPress WORDPRESS
Diploma PHP,WORDPRESS
MainCourseName CourseCombination
FoundationPHP PHP
FoundationWordPress WORDPRESS
Diploma PHP,WORDPRESS
当用户单独通过WORDPRESS
进行搜索时,应得到以下结果
MainCourseName CourseCombination
FoundationPHP PHP
Diploma PHP,WORDPRESS
MainCourseName CourseCombination
FoundationWordPress WORDPRESS
Diploma PHP,WORDPRESS
MainCourseName CourseCombination
FoundationPHP PHP
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
Diploma PHP,WORDPRESS
如何获得上述结果PHP=1
MainCourse1和MainCourse3的课程PHP=1
所以应该说:
基础PHP
WORDPRESS PHP文凭
或者我不理解您的问题。您需要首先按
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();
没错,但是如果用户通过
PHP、WORDPRESS
进行搜索,那么这两门课程的组合应该只是结果。Foundation PHP
&Foundation WORDPRESS
不会出现。这个答案只会返回ID
值,不是名称,因为它不清楚您将结果投影到的视图模型是什么-例如,如果过滤器是{1,2}
,则结果将是MainCourseName:3,CourseCombination:“1,2”
。我可以修改它显示名字,一旦你的happy返回你期望的值。是的……得到了正确的答案,伙计。如果可能的话,请修改它显示名字。更新了答案。如果我正确地解释了你的模型,它现在应该给你CourseCode:“文凭”,CourseCombination:“PHP,WORDPRESS”
如果过滤器是{1,2}
,如果可能的话,请研究一下这个问题@ksg,我倾向于同意Scott Chamberlain的评论。如果要创建数字,请在触发器中执行,但仅与插入操作关联。虽然我不明白为什么它们需要顺序-它们应该是唯一的。如果发票被删除,你就会遇到问题。