1

我有两张桌子

  1. 用户请求
  2. 用户朋友

我想获取所有关于我的 userfriendrequests 数据,但排除那些存在于我的 userfriends.FriendID 列表中的 userfriendrequests.UserID

我的 ID 是 1,我想找回我的好友请求。

userfriendrequests-table 我的好友请求列表

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

userfriends-table 我的朋友列表

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)

10 条记录的 DOUBLE QUERY 用时不到 7 秒,100 条记录用时超过一分钟。

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 回答