【问题标题】:Implement a Discover page with friends of friends与朋友的朋友一起实施发现页面
【发布时间】:2014-03-23 07:14:22
【问题描述】:

我有两个表 - 用户和关注。下表定义了两个用户,被关注的用户和被关注的用户。想想 Twitter 关注这样的想法。

我想做一个推荐人页面。这将按照其感知相关性的顺序建议追随者的追随者。

所以如果我有 A 人。

他跟着B和C

如果 B 和 C 都关注 D,而 B 关注 E。D 的相关性应该高于 E,以此类推。

有人可以帮我构建一个查询,以尽可能快的方式完成此操作。考虑到拥有大量追随者的人的潜力。

最终,我想要一个页面显示 - 看看这些人:你关注的人中有 4 人正在关注约翰。

我的表格示例

public class User 
{
    public long UserId { get; set; }

    public string Name { get; set; }
}

public class Follow 
{
    public long FollowId { get; set; }

    public User Follower { get; set; }
    public User Following { get; set; }
}

编辑 - 基于 Patrick Mcdonalds 答案的当前查询

var query = from follow in db.Follows
            where follow.WhoIsFollowing == mee
            let friend = follow.WhoTheyAreFollowing
            from friendOfFriend in db.Follows
            where friendOfFriend.WhoIsFollowing == friend
            group friendOfFriend by friendOfFriend.WhoTheyAreFollowing into g
            where g.Key != mee
            select new { UserId = g.Key, Count = g.Count() };

【问题讨论】:

    标签: c# asp.net linq entity-framework


    【解决方案1】:

    您可以从以下内容开始:

    List<Follow> followers = new List<Follow>();
    
    var query = from follow in followers
                where follow.Follower.UserId == 1
                let friend = follow.Following
                from friendOfFriend in followers
                where friendOfFriend.Follower.UserId == friend.UserId
                group friendOfFriend by friendOfFriend.Following.UserId into g
                select new { UserId = g.Key, Count = g.Count() };
    
    var suggestionList = query.OrderByDescending(f => f.Count).ToList();
    

    那么您可能应该过滤掉您已经关注的用户以及您自己。 (如果您关注的每个人都关注您,您将出现在建议的顶部)

    编辑

    尝试以下方法来过滤掉你自己和你的追随者:

    int me = 1;
    
    var friends = from follow in followers
                  where follow.Follower.UserId == me
                  select follow.Following.UserId;
    
    var query = from friend in friends
                from friendOfFriend in followers
                where friendOfFriend.Following.UserId != me
                where !friends.Contains(friendOfFriend.Following.UserId)
                where friendOfFriend.Follower.UserId == friend
                group friendOfFriend by friendOfFriend.Following.UserId into g
                select new { UserId = g.Key, Count = g.Count() };
    
    var suggestionList = query.OrderByDescending(f => f.Count).ToList();
    

    【讨论】:

    • 太棒了。正是我所追求的。我能问一个简单的问题吗?我已经根据您的帖子编辑了帖子以添加我使用的内容,并且效果很好。但是你有没有机会帮助删除登录用户关注的人?在我运行该查询时,它带有我(登录用户)关注的用户,所以我在
    【解决方案2】:

    根据你的存储机制,你不需要使用“Follow”作为中介。

    考虑这个结构:

    public class User 
    {
        public long UserId { get; set; }
        public string Name { get; set; }
        public List<User> Following { get; set;}
    }
    

    现在您可以轻松检索此人关注的对象。

    假设您有一个List&lt;User&gt; userList,并且您想要搜索它们以查找谁在关注用户 ID 5

    var user5 = userList.Where(x => x.UserID == 5).FirstOrDefault();
    var usersFollowingUserID5 = userList.Where(x => x.Following.Contains(user5));
    

    【讨论】:

      【解决方案3】:

      为了保持您当前的结构,您可以这样做:

      var john = userList.Where(x=> x.Name == "John").FirstOrDefault();
      var peopleFollowingJohn = followingList.Where(x => x.Following ==  john);
      var peopleJohnIsFollowing = followingList.Where(x => x.Follower ==  john);
      

      【讨论】:

        猜你喜欢
        • 2011-08-10
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多