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

当我获得正文时,我就会得到与该文章相关的标签。然后,我将文章的IDArticle和TagList传递给函数,以获取相关的3篇文章。
在文章和标签之间起粘合剂作用的列表是ArticoloTag,我认为这是要检查的列表,以获得具有最多重复标签的文章。
显然,我认为在服务器端用c#开发这个算法更好。如何使用linq做到这一点?
感谢你的帮助
发布于 2017-01-31 17:47:27
为了找到标签最常见的前3篇文章,您可以使用ArticoloTag并在IdTag上加入它自己
linq可能如下所示:
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表添加连接,以获取实际的项目
发布于 2017-01-31 17:56:37
我可能误解了您的问题,但是当您想要从共享关系表的表中获取数据时,您将需要从最低的表开始,然后以分组的形式返回。你将不得不在这里做你的数据库代码,因为我不知道你将使用什么。这不是实际的编译代码,而是指导代码:
var list = dbConext.Tag.Where([your filter]).SelectMany( i => i.ArticoloTags).GroupBy(i => i.IDTag).OrderBy(i=>i.Count()).ToList();从这个列表中,你可以做你想做的事情。
发布于 2017-01-31 18:36:34
我不确定这是不是很低效,但您可以尝试如下所示(searchTagList是给定文章的标记列表)
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();下面是我使用的数据结构。
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; }
}https://stackoverflow.com/questions/41953601
复制相似问题