LINQ用户存在的房间ID

时间:2018-04-01 04:31:14

标签: sql linq join

我有两张桌子:

聊天室

  • Id(int)

ChatUser (我将用户插入聊天室,每位用户1行)

  • RoomId(int)//表ChatRoom中的ID
  • UserId(int)

我想把我喜欢的房间整理出去。

ChatUserDTO chatUser = db.ChatUser.Where(x => x.UserId == userId);

但是如何获得具有变量userId2的第二个用户所在的房间ID? 如果没有两个用户都存在的房间,则应返回RoomId = 0。

使用此代码但必须有更好的方法来实现它。

var chatExists = (from cu in db.ChatUser
                 where cu.UserId == userId    
                 select new { cu.RoomId })
                 .ToList();

var chatRoomId = 0;

foreach (var item in chatExists)
{
    ChatUserDTO checkRoom = 
            db.ChatUser.FirstOrDefault(
                x => x.UserId == userId2 && x.RoomId == item.RoomId);

    if (checkRoom != null)
        chatRoomId = checkRoom.RoomId;
}

2 个答案:

答案 0 :(得分:0)

您可以与两组房间相交,这可以提供比您要求的更多信息:

var rooms1 = db.ChatUser.Where(cu => cu.UserId == userId).Select(cu => cu.RoomId);
var rooms2 = db.ChatUser.Where(cu => cu.UserId == userId2).Select(cu => cu.RoomId);

var roomsWithBoth = rooms1.Intersect(rooms2);

另一种方法是使用GroupBy按房间对ChatUser记录进行分组,然后找到包含userIds的房间。如果您拥有N个不同的用户并且正在寻找一个公共休息室,那么这种方法可能会更好。

答案 1 :(得分:0)

您可以使用Ling to SQL JOIN然后使用Lambda表达式从query中找出您要查找的内容。

它看起来像这样:

var rooms = (from cu in db.ChatUser
            join cr in db.ChatUser on cu.Id equals cr.UserId
            select cu).ToList();
//Now Sort 
var rooms = rooms.Where(x => x.UserId.equals(userId) && x.UserId !=null ).Select(x => RoomId).FirstorDefault();

我不完全确定这是否是您正在寻找的。也许它可以引导您了解如何重构代码,并使其看起来更整洁。