C# linq中的组合查询
我有两张桌子C# linq中的组合查询,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我有两张桌子 用户友好请求 用户朋友 我想获取有关userfriendrequests数据的所有信息,但排除存在于我的userfriends.FriendID列表中的那些userfriendrequests.UserID 我的ID是1,我想检索我的好友请求 userfriendrequests表 我朋友的请求列表 UserID FriendID 2 1 3 1 4 1
UserID FriendID
2 1
3 1
4 1
5 1
6 1
7 1
用户朋友表
我的朋友名单
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;
在这里,我使用的是一个可计算的,所以我可以直接使用selectnewfriendrequest(uf)
重复查询10条记录所需时间不到7秒,100条记录所需时间超过一分钟。是否加入组。如果未找到当前用户的朋友,请选择“用户”
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
认为它将具有相同的性能命中率,但可以
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
});
围棋您使用的是哪种LINQ提供商?LINQ对实体?是的。我使用的是实体框架,VS2012为什么不标记接受/拒绝的请求?或者在用户执行任何操作后删除它们?@Uril我真的不明白你的意思。不确定这是否能作为实体框架映射工作。任何到嵌套联合的映射都会对性能造成巨大影响…@user1793607现在无法验证性能,但我看不到在一个查询中执行任务的其他选项。@lazyberezovsky谢谢。它很好用。无论如何
g.Count()==0
比g.Any()
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
});