Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq中的组合查询_C#_Linq_Linq To Entities - Fatal编程技术网

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

我有两张桌子

  • 用户友好请求
  • 用户朋友
  • 我想获取有关userfriendrequests数据的所有信息,但排除存在于我的userfriends.FriendID列表中的那些userfriendrequests.UserID

    我的ID是1,我想检索我的好友请求

    userfriendrequests表 我朋友的请求列表

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