C# 如何优化此SQL查询?

C# 如何优化此SQL查询?,c#,sql,sql-server,optimization,C#,Sql,Sql Server,Optimization,下面的查询获取一个类别的所有论坛帖子。我还需要显示每个帖子的最新评论时间。但由于这一点,提出这个问题似乎需要更多的时间。(这是有道理的) 但我不知道如何优化它,我也不知道在哪里可以找到这方面的信息。 如果您能为我的问题提供任何建议或解决方案,我们将不胜感激 查询以获取类别的初始帖子 var query = context.ctm_Forum_Post.Where(x => x.Deleted == false && x.FK_Categori_ID == Id) .

下面的查询获取一个类别的所有论坛帖子。我还需要显示每个帖子的最新评论时间。但由于这一点,提出这个问题似乎需要更多的时间。(这是有道理的)

但我不知道如何优化它,我也不知道在哪里可以找到这方面的信息。 如果您能为我的问题提供任何建议或解决方案,我们将不胜感激

查询以获取类别的初始帖子

var query = context.ctm_Forum_Post.Where(x => x.Deleted == false && x.FK_Categori_ID == Id)
    .Select(x => new ForumPostModel()
    {
        Id = x.Id,
        Title = x.Title,
        BodyText = x.BodyText,
        Summary = x.Summary,
        Archieved = x.Archieved,
        Created = x.Created,
        Deleted = x.Deleted,
        MemberID = x.FK_Member_ID,
        Sticky = x.Sticky,
        Updated = x.Updated,
        CategoryId = x.FK_Categori_ID
    }).ToList();

foreach (var item in query)
{
    item.LatestCommentTime = this.GetNewestCommentDateByPost(item.Id);
}
return query.OrderByDescending(x=> x.Created);
对于每一篇文章,我都要再打一次电话到数据库

 var query = (from comments in context.ctm_Comments
                                 join posts in context.ctm_Forum_Post on comments.Page_ID equals posts.Id
                                 where posts.Id == id && comments.Deleted == false
                                 orderby comments.Reqistration_timestamp descending
                                 select comments.Reqistration_timestamp).FirstOrDefault();
评论表

 public partial class ctm_Comments
    {
        public int ID { get; set; }
        public int Page_ID { get; set; }
        public int Member_ID { get; set; }
        public string Comment { get; set; }
        public Nullable<System.DateTime> Reqistration_timestamp { get; set; }
        public bool Deleted { get; set; }
        public Nullable<System.Guid> Page_Guid { get; set; }
    }
public partial class ctm_Forum_Post
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string BodyText { get; set; }
        public string Summary { get; set; }
        public int FK_Categori_ID { get; set; }
        public bool Archieved { get; set; }
        public bool Deleted { get; set; }
        public bool Sticky { get; set; }
        public int FK_Member_ID { get; set; }
        public System.DateTime Created { get; set; }
        public System.DateTime Updated { get; set; }
    
        public virtual ctm_Forum_Category ctm_Forum_Category { get; set; }
    }
试试这个代码

requistration\u timestamp
属性添加到
ForumPostModel

public class ForumPostModel
{
    //other property............................... 
    public Nullable<System.DateTime> Reqistration_timestamp { get; set; }
}

你是想把所有的问题都放在一个查询中吗?您为什么不使用分页来获取最近10-20篇文章,这样可以加快查询速度,然后使用单独的查询来获取该文章的评论

如果您需要拉取大数据,我建议您使用存储过程,因为它通过快速执行计划进行了优化


我不知道为什么要使用连接来获取评论,您可以在评论字段中添加帖子ID,然后使用一个简单的查询来获取该帖子的评论,而不使用连接,除非您不尝试从帖子表中获取其他数据。

An总是很好的。想象一下,如果我有一个只有key和fk的
Forum\u Post
Post
Comment
类,使用的属性(例如deleted,timestamp)和一个伪属性来识别它们。我们也可以用一个帖子,两个注释来进行简单的列表初始化。我将为懒惰的人做一个简单的过程或视图。但是使用100%sql来避免翻译过程中的任何问题。我添加了两个表@DragandDropRelated:和linq分组联接:我想我加入是因为我试图在一个查询中获得所有数据,但当我不能时,我忘了删除它^^
var query = context.ctm_Forum_Posts
         .Join(context.ctm_Comments,
         post => post.Id,
         comment => comment.Page_ID,
         (post, comment) => new
         {
             p = post,
             c = comment
         }
        ).Where(x => x.p.Deleted == false && x.p.FK_Categori_ID == Id).OrderByDescending(x => x.c.Reqistration_timestamp).Take(1)
        .Select(x => new ForumPostModel()
        {
           Id = x.p.Id,
           Title = x.p.Title,
           BodyText = x.p.BodyText,
           Summary = x.p.Summary,
           Archieved = x.p.Archieved,
           Created = x.p.Created,
           Deleted = x.p.Deleted,
           MemberID = x.p.FK_Member_ID,
           Sticky = x.p.Sticky,
           Updated = x.p.Updated,
           CategoryId = x.p.FK_Categori_ID,
           LatestCommentTime = this.GetNewestCommentDateByPost(x.p.Id),
           Reqistration_timestamp = x.c.Reqistration_timestamp
        }).OrderByDescending(x => x.Created).ToList();