从表格中选择最多评论的前10个条目的linq查询

18
我有两张表格,"POSTS" 和 "COMMENTS"。一个帖子可以有很多评论,我想要选出拥有最多评论的前10个帖子。在评论表中,post_id 是一个外键。我正在使用 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查询,它给出一个错误信息:"Sequence operators not supported for type 'System.String'."。

2个回答

50

这个错误信息是因为你在一个字符串属性 (QUEST_TEXT) 上调用了.Count()。 字符串可以枚举,所以编译器没有报错。但是Linq-to-SQL不理解这个操作。

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

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

然而,您发布的代码与您提供的描述不完全匹配。您提到了评论,但代码却涉及回答。


获取回答最多的前10个问题! - stooicrealism
1
@ShaneAdrianMuaz,我已经更改了代码以显示“answers”而不是“comments”,但这实际上取决于您的DBML设置。您是否对这些表之间的关系进行建模?如果是这样,请找出关系的名称并使用它。 - Drew Noakes

4

加入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
@Magnus,这将评论表连接到帖子表。在您的情况下,ID属性名称可能不同,可以根据您定义的进行调整。 - scottm
@scottm,我尝试了这个方法,但是它给出了一个错误:“不支持类型为'System.String'的序列运算符。”...我已经更新了问题以显示我的查询现在... - stooicrealism
你是不是应该用 Count() 而不是 Count - Drew Noakes
@scottm 如果您像您所做的那样使用属性 p.Comments,那么这将自动完成。 - Magnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接