我有两张桌子
- 用户请求
- 用户朋友
我想获取所有关于我的 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 条记录用时超过一分钟。