我是 linq 的新手,我开始写这个查询:
var dProjects = Projects
.Select(p => new Models.Project {
ProjectID = p.ProjectID,
Status = p.Status,
ExpiresOn = p.ExpiresOn,
LatestComments = p.ProjectComments
.OrderByDescending(pc => pc.CreatedOn)
.Select(pc => pc.Comments)
.FirstOrDefault(),
ProjectFileIDs = p.ProjectFiles
.Select(pf => pf.BinaryFileID)
.AsQueryable()
})
.AsQueryable<Models.Project>();
我已经知道这个查询会执行得很慢,因为相关实体喜欢ProjectComments
并且ProjectFiles
会创建嵌套选择,尽管它可以工作并给我我需要的正确结果。
如何优化此查询并获得相同的结果?我的一个猜测是使用inner join
但是已经通过键在数据库ProjectComments
中ProjectFiles
建立了关系,所以不确定我们可以通过再次设置关系来实现什么。
基本上,需要知道从性能角度来看哪种方法最好。需要注意的一件事是我正在排序ProjectComments
并且只取最近的一个。我应该使用join
and的组合group by into
吗?帮助将不胜感激。谢谢。
更新:
抱歉,如果我对我要做什么还不够清楚。基本上,在前端,我有一个网格,它显示带有最新项目评论的项目列表和与项目关联的所有文件的列表,因此用户可以单击这些链接并实际打开这些文档。所以我上面的查询是有效的,它确实在网格中显示了以下内容:
项目 ID(来自项目表) 状态(来自项目表) ExpiresOn(来自项目表) LatestComments(来自 ProjectComments 表的最新条目,其项目 ID 作为外键) ProjectFileIDs(来自 ProjectFiles 表的文件 ID 列表,其中项目 ID 作为外键- 我正在使用这些文件 ID 并创建链接,以便用户可以打开这些文件)。
所以一切正常,我已经设置好了,但是查询有点慢。现在我们的数据非常少(只有测试数据),但是一旦启动,我预计会有很多用户/数据,因此我想在它上线之前将这个查询优化到最好。所以,这里的目标是基本上优化。我很确定这不是最好的方法,因为这会创建嵌套选择。