1

私は2つのテーブルを持っています

  1. userfriendrequests
  2. ユーザーフレンド

userfriendrequestsデータのすべてを取得したいのですが、userfriends.FriendIDリストに存在するuserfriendrequests.UserIDを除外します

私のIDは1ですが、友達リクエストを取得したいと思います。

userfriendrequests-友達リクエストのリストを表示します

UserID          FriendID
    2               1
    3               1
    4               1
    5               1
    6               1
    7               1

userfriends-友達のリストを作成する

UserID          FriendID
    1               22
    1               23
    1               33
    1               55
    1               2
    1               3

結果は次のようになります。

userfriendrequests
UserID          FriendID
    4               1
    5               1
    6               1
    7               1

では、linqで単一のクエリのみでこれを行うにはどうすればよいですか?

これは私がこれまでに試したことです:ダブルクエリの使用

List<FriendRequest> myFriendRequest = new List<FriendRequest>();
using (dbasecoreEntities dbase = Logic.Utility.dbaseContext())
{
    var ufr = (from uf in dbase.userfriendrequests
               where uf.FriendID == details.UserID && !uf.IsBlocked && !uf.IsIgnored && uf.UserID != details.UserID
               select uf).OrderBy(i => i.RequestDate).Skip(skip).Take(take).ToList();

    var myfriends = (from frnd in dbase.userfriends where frnd.UserID == details.UserID select frnd.FriendID).ToList();
    ufr = ufr.Where(i => !myfriends.Any(j => j == i.UserID)).ToList();

    myFriendRequest = (from userFriend in ufr
                   select new FriendRequest(userFriend, details.GMTTimeZone)).ToList();
}

return myFriendRequest;

単一クエリの使用。しかし、これは結果を返すのに非常に長い時間がかかります。

using (dbasecoreEntities dbase = Logic.Utility.dbaseContext())
{
    var list = (from uf in dbase.userfriendrequests.Where(i => i.FriendID == details.UserID && !i.IsBlocked && !i.IsIgnored && i.UserID != details.UserID).AsEnumerable()
                where !dbase.userfriends.Where(i => i.UserID == details.UserID).Any(j => j.UserID == uf.UserID)
                select new FriendRequest(uf)).OrderBy(i => i.RequestDate).Skip(skip).Take(take).ToList();

    return list;
}

ここではAsEnumerableを使用しているので、select new FriendRequest(uf)を直接使用できます。

DOUBLE QUERYは、10レコードの場合は7秒未満、100レコードの場合は1分以上かかります。

4

2 に答える 2

1

グループに参加してください。現在のユーザーの友達が見つからなかった場合は、ユーザーを選択します

var query = from uf in dbase.userfriendrequests
            join frnd in dbase.userfriends 
                 on uf.UserID equals frnd.FriendID into g
            where !g.Any()
            select uf;

代わりに!g.Any()を使用できますg.Count() == 0

于 2012-11-09T11:10:42.280 に答える
1

同じパフォーマンスヒットになると思いますが、

var query = dbase.userfriendsrequests.Select(user => new 
                                             { 
                                              UserID = user.FriendID,
                                              FriendID = user.UserID
                                             }
                 .Except(
                   dbase.userfriends.Select(frnd => new 
                                             { 
                                              UserID = frnd.FriendID,
                                              FriendID = frnd.UserID
                                             });

于 2012-11-09T11:30:47.187 に答える