0

我有一个包含这四个多对多相关实体的 DbContext:

Classes <-> Students
Classes <-> Assignments
Classes <-> Contents
Classes <-> Announcements

现在我需要一个 Linq 代码(或者……更好!),它将为我们提供最后 3 个作业最后 3 个内容、每个班级的最后 3 个公告,其中 StudentId = X 的学生在这些班级中。

另一方面,学生登录网站,我们想向他/她展示他/她正在学习的每个班级的最后作业、内容、公告。

此代码不正确,但可以帮助您了解我的需求。此代码也需要多次运行(50ms 不是很多吗?):

编辑:代码几乎是正确的,所以转移到 answer ,看看接受的答案。任何其他(更好,更快)的解决方案表示赞赏。

提前致谢。

4

2 回答 2

0

你最好从学生开始查询:

from s in db.Students
where s.StudentId == CurrentUser
from c in s.Classes
from as in c.Assignments.OrderByDescending(As => As.Id).Take(3)
from co in c.Contents.OrderByDescending(Co => Co.Id).Take(3)
from an in c.Announcements.OrderByDescending(An => An.Id).Take(3)
select new { <selected properties> }

最后一部分(选定的属性)很重要。通过仅选择属性的子集,您可以缩小数据库中的结果集。如果没有这个,您将创建一个非常宽且长的结果集,因为 (SQL) 查询中有大量连接。

于 2013-02-28T22:03:04.827 回答
0

根据@Gert Arnold的建议,我对代码做了一些改动:

  • 用学生开始查询
  • 通过更改选定的属性来缩小结果范围
db.Students.Where(st => st.StudentId.Equals(CurrentUser)).SelectMany(S => S.Classes, (S, C) => new
{
    Name = C.Name,
    Assignments = C.Assignments.Select(AS => new { AS.Id, AS.Name }).OrderByDescending(As => As.Id).Take(3),
    Contents = C.Contents.Select(Co => new { Co.Id, Co.Title }).OrderByDescending(Co => Co.Id).Take(3),
    Announcements = C.Announcements.Select(An => new { An.Id, An.Title }).OrderByDescending(An => An.Id).Take(3)
});
于 2013-03-01T19:30:05.427 回答