linq中的组合查询

时间:2012-11-09 11:04:05

标签: c# linq linq-to-entities

我有两张桌子

  1. userfriendrequests
  2. userfriends
  3. 我希望获得所有关于我的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分钟。

2 个答案:

答案 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
                                             });

去吧