如何使用LINQ成功查询0个申请人的数据库

时间:2018-12-11 16:42:43

标签: asp.net linq

我正在尝试调试此代码,以确保它使用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;

2 个答案:

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

显然您有表StudentsApplicationsStudentsApplications之间存在一对多的关系:每个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才查询数据库,因此不会提高性能。肯定会降低代码的可读性。