You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Entity Framework Core左连接多表查询用户好友详情问题求助

问题原因

你原写法的核心问题是只关联了Connection表的User1字段到用户详情,没有区分当前用户在连接里是User1还是User2,导致始终取的是连接中User1的信息,而非好友的信息;同时直接同步阻塞ToListAsync().Result容易在ASP.NET Core环境触发线程死锁,也没有做空值防护。


正确实现代码

推荐异步版本(性能更优,无死锁风险)

internal async Task<ChatModel> GetChatHistoryAsync(int userID)
{
    ChatModel chat = new ChatModel();
    // 先查当前用户信息,做空值防护
    var currentUser = await this.UserCredentials.FirstOrDefaultAsync(m => m.Id == userID);
    if (currentUser == null)
    {
        throw new ArgumentException("用户不存在");
    }
    chat.UserName = currentUser.Username;
    chat.UserID = userID;

    var result = from conn in this.Connections
                 // 筛选当前用户参与的所有连接
                 where conn.User1 == userID || conn.User2 == userID
                 // 计算好友ID:当前用户是User1则好友是User2,反之则是User1
                 let friendId = conn.User1 == userID ? conn.User2 : conn.User1
                 // 关联好友的详情信息
                 join friendDetail in this.UserDetails on friendId equals friendDetail.Id
                 // 关联好友的账号信息取用户名
                 join friendCredential in this.UserCredentials on friendId equals friendCredential.Id
                 select new ChatWeb_MVC.Models.UserDetail
                 {
                     Id = friendId,
                     ConnectionID = conn.Id,
                     Username = friendCredential.Username,
                     FullName = friendDetail.FullName,
                     Avatar = GetAvatar(friendDetail.Avatar),
                     LastSeen = friendDetail.LastSeen,
                 };

    chat.Connections = await result.ToListAsync();
    return chat;
}

同步版本(适配原有方法签名)

internal ChatModel GetChatHistory(int userID)
{
    ChatModel chat = new ChatModel();
    var currentUser = this.UserCredentials.FirstOrDefault(m => m.Id == userID);
    if (currentUser == null)
    {
        throw new ArgumentException("用户不存在");
    }
    chat.UserName = currentUser.Username;
    chat.UserID = userID;

    var result = from conn in this.Connections
                 where conn.User1 == userID || conn.User2 == userID
                 let friendId = conn.User1 == userID ? conn.User2 : conn.User1
                 join friendDetail in this.UserDetails on friendId equals friendDetail.Id
                 join friendCredential in this.UserCredentials on friendId equals friendCredential.Id
                 select new ChatWeb_MVC.Models.UserDetail
                 {
                     Id = friendId,
                     ConnectionID = conn.Id,
                     Username = friendCredential.Username,
                     FullName = friendDetail.FullName,
                     Avatar = GetAvatar(friendDetail.Avatar),
                     LastSeen = friendDetail.LastSeen,
                 };

    chat.Connections = result.ToList();
    return chat;
}

内容的提问来源于stack exchange,提问作者Blue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:48:03