首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按元素选择重复次数最多的项目

问按元素选择重复次数最多的项目
EN

Stack Overflow用户
提问于 2017-01-31 17:13:56
回答 4查看 114关注 0票数 0

我正在尝试获得3篇相关文章,大多数标签与主要文章的共同之处。我有这个DB结构:

​

​

当我获得正文时,我就会得到与该文章相关的标签。然后,我将文章的IDArticle和TagList传递给函数,以获取相关的3篇文章。

在文章和标签之间起粘合剂作用的列表是ArticoloTag,我认为这是要检查的列表,以获得具有最多重复标签的文章。

显然,我认为在服务器端用c#开发这个算法更好。如何使用linq做到这一点?

感谢你的帮助

EN

回答 4

Stack Overflow用户

发布于 2017-01-31 17:47:27

为了找到标签最常见的前3篇文章,您可以使用ArticoloTag并在IdTag上加入它自己

linq可能如下所示:

代码语言:javascript
复制
ArticoloTag.Where (a=>a.IdArticolo== mainArticleId).Join(ArticoloTag, a=>a.IdTag, a=>a.IdTag, (a,b)=> b.IdArticolo).GroupBy(a=>a.IdArticolo).OrderBy(g=>g.Count()).Select(g => g.Key).Take(3)

这将取回你的3个IdArticle。

您可以向Articolo表添加连接,以获取实际的项目

票数 1
EN

Stack Overflow用户

发布于 2017-01-31 17:56:37

我可能误解了您的问题,但是当您想要从共享关系表的表中获取数据时,您将需要从最低的表开始,然后以分组的形式返回。你将不得不在这里做你的数据库代码,因为我不知道你将使用什么。这不是实际的编译代码,而是指导代码:

代码语言:javascript
复制
var list = dbConext.Tag.Where([your filter]).SelectMany( i => i.ArticoloTags).GroupBy(i => i.IDTag).OrderBy(i=>i.Count()).ToList();

从这个列表中,你可以做你想做的事情。

票数 1
EN

Stack Overflow用户

发布于 2017-01-31 18:36:34

我不确定这是不是很低效,但您可以尝试如下所示(searchTagList是给定文章的标记列表)

代码语言:javascript
复制
var relavantList = articleList.
            Select(a => new {
                artical = a,
                relevancyCount = a.ArticoloTag.Where(tag => searchTagList.Contains(tag)).Count()
            }).
            ToList().
            OrderByDescending(a => a.relevancyCount).
            ThenBy(a => a.artical.Title). //if similar relevancy then ordered by title
            Take(3).ToList();

下面是我使用的数据结构。

代码语言:javascript
复制
class Articolo {

    public int ID { get; set; }

    public List<Tag> ArticoloTag { get; set; }

    public string Title { get; set; }

}

class Tag {

    public int ID { get; set; }

    public string TagText { get; set; }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41953601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档