C# - 排除二级关注者中已经关注的用户

时间:2013-04-20 14:45:04

标签: c# linq twitter where

我想找到我的粉丝的追随者,我没有在Twitter上关注。

为此,我有一个名为Following的表,它有三个coulmns ID,Follower_iD和Following_iD

我的代码如下:

var userIDs = database.Followings.Where(u => u.Follower_id == MY.Id);

foreach (var userID in userIDs)
{
     var secondUserIDs = database.Followings.Where(u => u.Follower_id == userID.Following_id).Except(userIDs);

即使我写了.Except(userIDs)以消除我关注的人,输出也包括我已经遵循的记录。

为了更好地解释我的问题,这是一个例子:

假设我的身份证是10。

在数据库中有记录:

follower_id      following_id
    10                11
    10                12
    10                13
    10                14
    14                12
    14                13
    14                15

所以问题是,因为我跟随12和13,所以在我的查询中不需要返回(14,12)和(14,13)对。

1 个答案:

答案 0 :(得分:2)

Except使用set来确定不应返回的元素,因此您需要覆盖EqualsGetHashCode方法才能使其正常工作。但我仍然认为它不会与linq合作推特。

但是,我会选择以下内容:

var userIDs = database.Followings.Where(u => u.Follower_id == MY.Id)
                                 .Select(u => u.Following_id)
                                 .ToList(); // ToList(), to make it happen only once

foreach (var userID in userIDs)
{
     var secondUserIDs = database.Followings.Where(u => u.Follower_id == userID)
                                            .Select(u => u.Following_id)
                                            .Except(userIDs).;
}

不同之处在于,您只在查询中使用ID,而不是整个对象。

<强>更新

您可以尝试使用Contains()获取所有没有foreach循环的内容:

var secondUserIDs = database.Followings.Where(u => userIDs.Contains(u.Follower_id) && !userIDs.Contains(u.Following_id))
                                       .Select(u => u.Following_id);