2

user_ids とsを保持するテーブルを持つデータベースがありますtag_id。2 つの を取り、両方のユーザーが共通に持っている をuser_id返す関数を書きたいと思います。tag_id

これらは、データベースからのサンプル行です。

   User_id     Tag_id
     1          100
     1          101
     2          100
     3          100
     3          101
     3          102

私が自分の関数に求めているのは、自分の関数を のように呼び出すと、getCommonTagIDs(1, 3)が返されること(100,101)です。これまでに行ったことは、関連する行をuser_id2 つの異なるリストに保持し、for ループを使用して共通tag_idの s を返すことです。

 using (TwitterDataContext database = TwitterDataContext.CreateTwitterDataContextWithNoLock())
        {

            IEnumerable<Usr_Tag> tags_1 = database.Usr_Tags.Where(u => u.User_id == userID1).ToList();
            IEnumerable<Usr_Tag> tags_2 = database.Usr_Tags.Where(u => u.User_id == userID2).ToList();

            foreach (var x in tags_1)
            {
                foreach (var y in tags_2) {
                    if (x.Tag_id == y.Tag_id) {
                        var a =database.Hashtags.Where(u => u.Tag_id==x.Tag_id).SingleOrDefault();
                        Console.WriteLine(a.Tag_val);  
                    }

                }
            }
        }

私が聞きたいのは、データベースからすべての行を取得して関数で共通の s を検索する代わりに、データベース側で計算を行うことにより、LINQ を使用してデータベースからtag_id共通の s を直接取得したいということです。tag_id助けていただければ幸いです。

これは私が書いたSQLです:

 SELECT [Tag_id]
 FROM [BitirME].[dbo].[User_Tag]
 WHERE USER_ID = '1'  AND Tag_id IN (
 SELECT [Tag_id]
 FROM [BitirME].[dbo].[User_Tag]
 where USER_ID = '3')
4

3 に答える 3

2

必要なのは、これら 2 つのセットの「交差」です。

var commonTags = database.Usr_Tags.Where(u => u.User_id == userID1).Select(u => u.Tag_id)
    .Intersect(database.Usr_Tags.Where(u => u.User_id == userID2).Select(u => u.Tag_id));

そして出来上がり、完了です。

または、少しクリーンアップするには:

public static IQueryable<int> GetUserTags(int userId)
{
    return database.Usr_Tags
        .Where(u => u.User_id == userId)
        .Select(u => u.Tag_id);
}

var commonTags = GetUserTags(userID1).Intersect(GetUserTags(userID2));
于 2013-05-06T21:28:30.657 に答える
1

これを行う1つの方法は次のとおりです。

int[] users = new int[] {1,3};  // for testing

database.Ustr_Tags.Where(t => users.Contains(t.User_id))
                  .GroupBy(t => t.Tag_id)
                  .Where(g => users.All(u => g.Any(gg=>gg.User_id == u)))  // all tags where all required users are tagged
                  .Select(g => g.Key);

この 1 つの利点の 1 つは、任意の数のユーザー (2 人だけでなく) に使用できることです。

于 2013-05-06T21:29:12.643 に答える
0

私が正しければ、このようなクエリが必要かもしれません

var q = from t in database.Usr_Tags
        //all Usr_Tags for UserID1
        where t.User_Id == userID1 &&
        //and there is a User_tag for User_ID2 with same Tag_ID
        database.User_Tags.Any(t2=>t2.User_ID==userID2 && t2.Tag_ID==t.Tag_ID)
        select t.Tag_Id;

var commonTags = q.ToList();
于 2013-05-06T21:21:37.410 に答える