【问题标题】:join two table with two foreign Key用两个外键连接两个表
【发布时间】:2013-08-28 06:02:20
【问题描述】:

我有一个包含用户数据的表

Users(userID, name , email ,......)

我有另一个表,其中包含:

Userfriends(UserFriendID,Fk_UserSendReqID,FK_UserRecieveReqID,IsAccepted,....)

在 UserFriends 表中有两个外键将该表与用户表连接起来 我想用 linq 写一个查询,用userId=2 选择用户的朋友 我写了这个查询,但它是错误的

 var n = from u in DataContext.Context.Users
                join uf in DataContext.Context.UsersFriends
                on u.UserID equals uf.UserSendReqID
                join uf2 in DataContext.Context.UsersFriends
                on u.UserID equals uf2.UserRecieveReqID
                where (uf.UserSendReqID == 2|| uf.UserRecieveReqID == 2)
                && uf.IsAccepted == true
                select new
                {
                    name = u.FirstName + " " + u.LastName
                };

【问题讨论】:

    标签: c# asp.net sql linq


    【解决方案1】:

    由于Users 表有 2 个外键,因此您必须加入 Users 表而不是 UsersFriends

    var userID = 2;
    var n = from u in DataContext.Context.Users
                join uf in DataContext.Context.UsersFriends
                on u.UserID equals uf.UserSendReqID
                join u in DataContext.Context.Users
                on u2.UserID equals uf.UserRecieveReqID
                where (uf.UserSendReqID == userID || uf.UserRecieveReqID == userID)
                && uf.IsAccepted == true
                select new
                {
                    //if UserSendReqID == userID, then select for u, else u2
                    name = (uf.UserSendReqID == userID)
                                 ? (u.FirstName + " " + u.LastName)
                                 : (u2.FirstName + " " + u2.LastName)
                };
    

    【讨论】:

      【解决方案2】:
      var n = DataContext.Context.Users
                         .Where(u=>DataContext.Context.UsersFriends
                                  .Where(uf=>(uf.UserSendReqID == 2 ||
                                             uf.UserReceiveReqID == 2) && uf.IsAccepted)
                                  .Any(uf=>uf.UserFriendID == u.userID))
                         .Select(u=> new {
                                       Name = u.FirstName + " " + u.LastName                                     
                                     });
      

      或者使用Join:

      var n = DataContext.Context.Users
                         .Join(DataContext.Context.UsersFriends
                                          .Where(uf=>(uf.UserSendReqID == 2 ||
                                             uf.UserReceiveReqID == 2) && uf.IsAccepted),
                               x=>x.userID, x=>x.UserFriendID, (x,y)=>x)
                         .Select(u=> new {
                                       Name = u.FirstName + " " + u.LastName                                     
                                     });
      

      表达式查询:

      var n = from u in DataContext.Context.Users
              join uf in DataContext.Context.UsersFriends on u.userID equals uf.UserFriendID
              where (uf.UserSendReqID == 2 || uf.UserReceiveReqID == 2) && uf.IsAccepted
              select new {
                       Name = u.FirstName + " " + u.LastName
                     };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 2017-01-23
        • 2016-08-30
        相关资源
        最近更新 更多