链接 linq 查询
本文关键字:查询 linq 链接 | 更新日期: 2023-09-27 18:30:51
由于
在我的视图中为数据表创建了简单的过滤器,因此尝试链接 linq 查询。
public ActionResult Index(int? courseId, string grade, int? statusId)
{
var query = from s in db.Students
join e in db.Enrollments on s.ID equals e.ID
join c in db.Courses on e.CourseID equals c.ID
orderby e.Grade.HasValue descending, e.Grade, s.StatusID
select new { s, e, c };
if (courseId != null)
{
query = query.Where(q => q.e.CourseID == courseId);
}
if (!string.IsNullOrEmpty(grade))
{
query = query.Where(q => q.e.Grade.Equals(grade));
}
if (statusId != null)
{
query = query.Where(q => q.s.StatusID == statusId);
}
query.Select( q => new ViewModels.ReportView
{
ID = q.s.ID,
Name = q.s.FirstName + " " + q.s.LastName,
Course = q.c.Title,
Grade = q.e.Grade,
GraduationDate = q.s.GraduationDate,
Status = q.s.Status.Title
});
Linq 强制您使用 select 或组结束查询,这迫使我在开头放置不必要的选择。出于某种原因,这导致它忽略最后一个选择并仅使用初始选择。
我已经尝试按 e.ID 分组,但这并没有按预期工作......
我确定这很简单,但我迷路了,有什么想法吗?
我通常会创建一个辅助函数来简化复杂的 linq
class Test
{
public ActionResult Index(int? courseId, string grade, int? statusId)
{
var query = from s in db.Students
join e in db.Enrollments on s.ID equals e.ID
join c in db.Courses on e.CourseID equals c.ID
orderby e.Grade.HasValue descending, e.Grade, s.StatusID
select QueryResults(courseId, grade, statusId, s, e, c);
}
public ViewModels.ReportView QueryResults(int? courseId, string grade, int? statusId, Student student, Enrollments enrollment, Cource course)
{
if ((courseId != null) && (courseId != course))
{
return null;
}
if ((!string.IsNullOrEmpty(grade)) && (grade != enrollment.Grade))
{
return null;
}
if ((statusId != null) && (statusId != student.StatusID))
{
return null;
}
return new ViewModels.ReportView
{
ID = student.ID,
Name = student.FirstName + " " + student.LastName,
Course = course.Title,
Grade = enrollment.Grade,
GraduationDate = student.GraduationDate,
Status = student.Status.Title
});
}
}