帮助将T-SQL查询转换为LINQ查询

帮助将T-SQL查询转换为LINQ查询,linq,tsql,group-by,max,Linq,Tsql,Group By,Max,我是LINQ的新手,所以我很难回答一些非常简单的问题。不管怎么说,我已经有一段时间不同意这一点了,但我被难住了 这里有人能帮我把这个T-SQL查询转换成LINQ查询吗?一旦我看到它是如何完成的,我肯定我会对语法有一些疑问: SELECT BlogTitle FROM Blogs b JOIN BlogComments bc ON b.BlogID = bc.BlogID WHERE b.Deleted = 0 AND b.Draft = 0 AND b.[Default] = 0

我是LINQ的新手,所以我很难回答一些非常简单的问题。不管怎么说,我已经有一段时间不同意这一点了,但我被难住了

这里有人能帮我把这个T-SQL查询转换成LINQ查询吗?一旦我看到它是如何完成的,我肯定我会对语法有一些疑问:

SELECT BlogTitle
FROM Blogs b
JOIN BlogComments bc ON
  b.BlogID = bc.BlogID
WHERE b.Deleted = 0
  AND b.Draft = 0
  AND b.[Default] = 0
  AND bc.Deleted = 0
GROUP BY BlogTitle
ORDER BY MAX([bc].[Timestamp]) DESC
只是为了表明我自己已经尝试解决这个问题,这里是我到目前为止的想法,尽管它没有编译,更不用说工作了

var iqueryable = 
    from blog in db.Blogs
    join blogComment in db.BlogComments on
        blog.BlogID equals blogComment.BlogID
    where blog.Deleted == false
        && blog.Draft == false
        && blog.Default == false
        && blogComment.Deleted == false
    group blogComment by blog.BlogID into blogGroup
    orderby blogGroup.Max(blogComment => blogComment.Timestamp)
    select blogGroup;

我想我已经解决了,以防这对其他人有帮助

var iQueryable = 
 from blog in db.Blogs
 join blogComment in db.BlogComments on
     blog.BlogID equals blogComment.BlogID
 where blog.Deleted == false
     && blog.Draft == false
     && blog.Default == false
     && blogComment.Deleted == false
 group blogComment by blog.BlogTitle into blogGroup
 let maxTimeStamp = blogGroup.Max(blogComment => blogComment.Timestamp)
 let commentCount = blogGroup.Count()
 orderby maxTimeStamp descending
 select new RecentlyCommentedBlog() { BlogTitle = blogGroup.Key, CommentCount = commentCount };
我试图将此查询的结果作为IQueryable对象返回。如果不为这个查询创建一个新类,我无法找到任何方法来完成这个任务,这个查询名为RecentlyCommentedBlog。下面是该类的代码:

public class RecentlyCommentedBlog
{
    public string BlogTitle { get; set; }
    public int CommentCount { get; set; }

    public RecentlyCommentedBlog() { }

    public RecentlyCommentedBlog(string blogTitle, int commentCount)
    {
        BlogTitle = blogTitle;
        CommentCount = commentCount;
    }
}
不管怎么说,虽然这个解决方案似乎奏效了,但我还是忍不住认为肯定有更好的方法来实现这一点

from b in db.Blogs
where !b.Deleted
   && !b.Draft
   && !b.Default
   && !b.Deleted
order by b.BlogComments.Max(bc => bc.Timestamp) descending
select new {Blog = b, Count = b.BlogComments.Count()}
如果要返回一个
IQueryable
,则必须将其投影到一个类中,例如您的RecentlyCommentedBlog。匿名类(我的查询所显示的)不适合被命名为方法的返回类型


如果您的博客类中没有BlogComments属性,。

谢谢您,David。正如您所建议的,我选择通过向我的Blog分部类添加BlogComments属性来解决这个问题。