在多对多的关系中找到最相关的帖子

时间:2018-01-07 21:51:17

标签: entity-framework linq entity-framework-6

我首先在代码中有多对多的关系:

public class Post
{
    public int Id { get; set; }
    public ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public int Id { get; set; }
    public ICollection<Post> Posts { get; set; }
}

modelBuilder.Entity<Post>().HasMany(c => c.Tags).WithMany(a => a.Posts); 

如果我的Post Tags Tags,我可以通过考虑MarkerView获得最相关的帖子。

2 个答案:

答案 0 :(得分:0)

有几种方法。我的建议是:

/app

答案 1 :(得分:0)

首先,您需要定义相关应该如何...

最简单的方法是简单地检查共享最多标签的帖子。我们需要为给定的帖子和其他帖子执行此操作。我不会详述理论,你的查询至少会是这样的:

IQueryable<Post> posts = context.Posts.Where(x => x.Id != currentPost.Id)
                                      .OrderByDescending(x => x.Tags.Count(y => currentPost.Tags.Any(z => z.Id == y.Id)));

currentPostPost的一个实例,我们想要检索其相关的Post。计算在x.Tags.Count(y => currentPost.Tags.Any(z => z.Id == y.Id))部分完成。它计算与currentPost共享的标签数量。

有点复杂,你可以使用Jaccard Similarity。它只是将Post对中相同标记的数量除以该对中的Tag个总数。

int currentPostTagsCount = currentPost.Tags.Count();
IQueryable<Post> posts = context.Posts.Where(x => x.Id != currentPost.Id)
                                      .OrderByDescending(x => x.Tags.Count(y => currentPost.Tags.Any(z => z.Id == y.Id))
                                                              / (currentPostTagsCount + x.Tags.Count()));

免责声明:我没有测试过这个查询,带有谷物和盐 - 我会编辑,如果我有时间测试它不起作用。