2013-04-20 23 views
0

我想找到追隨者的追隨者,我沒有在Twitter中追蹤。C# - 排除已經在第二級別追隨者用戶

要做到這一點,我有一個叫下面的表有三個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); 

即使我寫的。除(用戶ID)爲了消除我關注的人,產出包括我已經遵循的記錄。

解釋我的問題比較好,這裏是例子:

假設我的編號爲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)對。

回答

2

Except使用set來確定不應返回的元素,因此您需要覆蓋EqualsGetHashCode方法以使其工作。但我仍然認爲它不會與linq一起使用twitter。

不過,我會去與以下:

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).; 
} 

不同的是,你只取身份證,而不是整個對象查詢。

更新

您可以嘗試使用Contains()讓所有無foreach循環:

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

能否請你在編輯的問題現在看起來,我解釋現在好了,因爲我不明白除了函數在你的答案,除去不必要的記錄 – CanCeylan 2013-04-20 15:20:32

+0

而對於短代碼,我得到了這個錯誤: 方法'System.Linq.Queryable.Contains (System.Linq.IQueryable ,TSource)'不能從用法中推斷出來。嘗試明確指定類型參數。 – CanCeylan 2013-04-20 20:35:09