我想找到我的粉丝的追随者,我没有在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)对。
答案 0 :(得分:2)
Except
使用set来确定不应返回的元素,因此您需要覆盖Equals
和GetHashCode
方法才能使其正常工作。但我仍然认为它不会与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);