我正在尝试调试此代码,以确保它使用LINQ在数据库中查询本周有零个应用程序的用户。当我将其与HTML.ActionLink连接时,没有得到正确的过滤结果。
case "No_Activity":
dateCriteria = DateTime.Now.AddDays(-7);
students = students.Where(s => db.JPApplications.Where(a => a.ApplicationUserId == s.ApplicationUserId && a.JPApplicationDate >= dateCriteria).Count() == 0);
break;
答案 0 :(得分:1)
您必须添加ToList(),因为为此的学生可以查询,请尝试以下方法:
students = students.Where(s => !db.JPApplications.Any(a => a.ApplicationUserId == s.ApplicationUserId && a.JPApplicationDate >= dateCriteria)).ToList()
然后像这样初始化您的日期:
dateCriteria = DateTime.ToDay.AddDays(-7)
我用Any()代替了count == 0。
答案 1 :(得分:0)
显然您有表Students
和Applications
。 Students
和Applications
之间存在一对多的关系:每个Student
都有零个或多个Applications
,并且每个Application
都拥有(由创建?)使用一个外键恰好是一个Student
。
此外,每个Application
都有(DateTime?)属性ApplicationDate
。
要求:
给定(DateTime)变量dateCriterium,查询所有在dateCriterium或之后未提交任何申请的学生。
在初级阶段:学生和所有在dateCriterium或之后提交的申请:
DateTime dateCriterium = ...
IQueryable<Student> students = ...
IQueryable<Application> applicationsAfterDate = allApplications
.Where(application => application.ApplicationDate >= dateCriterium);
提取确实提交了上述任何申请的所有学生的身份证。删除重复项:
var idsOfStudentsWithApplicationsOnOrAfterDate = applicationsAfterDate
.Select(application => application.StudentId)
.Distinct();
获取所有ID不在日期或之后提交申请的学生的学生ID列表中的所有学生,但其中不包含学生ID
var studentsWithoutApplicationsOnOrAfterDate = students
.Where(student => !idsOfStudentsWithApplicationsOnOrAfterDate.Contains(student.Id));
直到现在您仅创建查询,尚未查询数据库:
var result = studentsWithoutApplicationsOnOrAfterDate.ToList();
TODO:如果需要,可以将其放在一个大的LINQ语句中。由于直到ToList才查询数据库,因此不会提高性能。肯定会降低代码的可读性。