我有两张桌子
我希望获得所有关于我的userfriendrequests数据的信息,但不包括那些存在于我的userfriends.FriendID列表中的userfriendrequests.UserID
我的身份证是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)
对于10条记录,DOUBLE QUERY只需不到7秒,对于100条记录则需要超过1分钟。
答案 0 :(得分: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
。
答案 1 :(得分: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
});
去吧