【问题标题】:linq query to select top 10 entries with most comments from the tablelinq 查询从表中选择评论最多的前 10 个条目
【发布时间】:2015-10-29 00:31:39
【问题描述】:

我有两个表“POSTS”和“COMMENTS”。一个帖子可以有多个 cmets,我希望能够选择 cmets 数量最多的前 10 个帖子。 post_id 是 cmets 表中的 FK。我正在使用 Linq to SQL。请告诉我如何做到这一点。提前致谢。

编辑

var top = (from q in db.question_tables
                   from a in db.answer_tables
                   where q.QUEST_ID.Equals(a.ANS_QUEST_ID)
                   orderby q.QUEST_TEXT.Count() descending
                   select new
                   {
                       QUEST_TEXT = q.QUEST_TEXT


                   }).Take(10);

这就是我的 linq 查询现在的样子,它给出了一个错误“'System.String' 类型不支持序列运算符。”。 :/

【问题讨论】:

    标签: c# asp.net .net linq-to-sql


    【解决方案1】:

    该错误消息是因为您在字符串属性 (QUEST_TEXT) 上调用 .Count()。编译是因为字符串是可枚举的。但是,Linq-to-SQL 不理解这一点。

    如果您的 DBML 文件中映射了两个表之间的关系,那么您可以在表达式中使用它:

    var top = (from q in db.question_tables
               orderby q.answers.Count() descending
               select q).Take(10);
    

    但是您发布的代码与您提供的描述不完全匹配。您提到了 cmets,但代码谈论的是答案。

    【讨论】:

    • 获取答案最多的前 10 个问题!
    • @ShaneAdrianMuaz,我将代码更改为显示 answers 而不是 comments,但这实际上取决于您的 DBML 的设置方式。您是否对这些表之间的关系进行建模?如果是这样,找出关系的名称并使用它。
    【解决方案2】:

    加入PostsComments,按Post.Comment 降序排列,获得前10 名。

    (from p in Posts
    from c in Comments
    where c.PostId == p.Id
    orderby p.Comments.Count() descending
    select p).Take(10);
    

    编辑

    根据您的编辑,您似乎正在尝试查找具有最长 QUEST_TEXT 值的问题。如果这是您需要的,只需将您的代码更改为 orderby q.QUEST_TEXT.Length descending,但这听起来不像您最初要求的那样。

    【讨论】:

    • from c in Comments where c.PostId == p.Id 是做什么的?
    • @Magnus,将 Comments 表连接到 Posts 表。 ID 属性名称在您的情况下可能会有所不同,可以根据您定义的任何内容进行调整。
    • @scottm ,我试过这个,但它给了我一个错误,因为“类型'System.String'不支持序列运算符。” ...我已经更新了问题以显示我的查询..
    • 你的意思是Count()而不是Count吗?
    • @scottm 如果您使用属性p.Comments,则会自动完成。
    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多