Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从多到多表、DbContext和实体框架以及Linq的复杂投影_Linq_Entity Framework_Many To Many - Fatal编程技术网

从多到多表、DbContext和实体框架以及Linq的复杂投影

从多到多表、DbContext和实体框架以及Linq的复杂投影,linq,entity-framework,many-to-many,Linq,Entity Framework,Many To Many,我有一个与以下四个多对多相关实体的DbContext: Classes <-> Students Classes <-> Assignments Classes <-> Contents Classes <-> Announcements 班级学生 课堂作业 课程内容 课程公告 现在我需要一个Linq代码(或更好的!),它将为我们提供StudentId=X的学生所在的每堂课的最后3个作业,最后3个内容,最后3个公告 另一方面,学生登录网站,我们

我有一个与以下四个多对多相关实体的DbContext:

Classes <-> Students
Classes <-> Assignments
Classes <-> Contents
Classes <-> Announcements
班级学生
课堂作业
课程内容
课程公告
现在我需要一个Linq代码(或更好的!),它将为我们提供StudentId=X的学生所在的每堂课的最后3个作业最后3个内容最后3个公告

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

此代码不正确,但可能有助于您了解我的需要。此外,此代码需要多次运行(50ms不是很多吗?):

编辑:代码几乎正确,所以移动到答案,查看已接受的答案。任何其他(更好、更快)的解决方案都值得赞赏


提前感谢。

您最好从学生开始查询:

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> }
来自数据库中的s.Students
其中s.StudentId==CurrentUser
从c到s.类
从c.Assignments.OrderByDescending(as=>as.Id.Take)中的as开始
从c.Contents.OrderByDescending(co=>co.Id.Take)中的co开始
从c.Announcements.OrderByDescending(an=>an.Id)中的
选择新{}

最后一部分(选定的特性)很重要。通过仅选择属性的子集,可以缩小数据库中的结果集。如果没有这一点,由于(SQL)查询中有大量的联接,您将创建一个非常广泛和长的结果集。

基于@Gert Arnold建议,我对代码做了一些更改:

  • 用student启动查询
  • 通过更改选定特性缩小结果范围
db.Students.Where(st=>st.StudentId.Equals(CurrentUser))。选择多个(S=>S.class,(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)
});

与我的代码的不同之处在于,您在课堂上只选择了一个
SelectMany
。我的代码有更多的
选择多个
。我认为你的代码更好。你现在还有问题吗?否则,您可以将您的代码放在您自己问题的答案中,并将其标记为已接受。感谢您的建议,我正在等待可能其他人有更好的答案(更快)。另一个问题:我的新代码可以工作,但会消耗时间(作为EntityFrameworkProfiler在我的PC中为50毫秒),如果1000名学生同时请求此页面,是否可能存在问题?同时EntityFrameworkProfiler警告我避免过多的联接。有没有更快的办法。