【问题标题】:Help Converting T-SQL Query to LINQ Query帮助将 T-SQL 查询转换为 LINQ 查询
【发布时间】:2010-05-31 23:20:53
【问题描述】:

我是 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;

【问题讨论】:

    标签: linq tsql group-by max


    【解决方案1】:
    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<T>,你必须投射到一个类中,比如你的RecentCommentedBlog。匿名类(我的查询显示的内容)不适合将其命名为方法的返回类型。

    如果您的 Blog 类中没有 BlogComments 属性,create an association

    【讨论】:

    • 谢谢你,大卫。按照您的建议,我选择通过将 BlogComments 属性添加到我的 Blog 部分类来解决这个问题。
    【解决方案2】:

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

    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 对象返回。如果不创建一个新类,我就无法解决这个问题,只是为了这个查询,称为 RecentCommentedBlog。这是该类的代码:

    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;
        }
    }
    

    无论如何,虽然这个解决方案看起来很有效,但我不禁认为肯定会有更好的方法来实现这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      相关资源
      最近更新 更多