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

C#中使用Linq实现带Where条件的Left/Outer Join查询用户赛事成绩

没问题,这就给你写一个符合需求的C# LINQ左连接实现!咱们要做的是获取所有赛事信息,同时关联指定用户在对应赛事的得分,用户没参与的赛事得分就返回null,对吧?

首先先定义和数据库表对应的实体类,方便你直观理解:

// 赛事表实体
public class Entry
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// 用户参赛记录表实体
public class UserEntry
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int EntryId { get; set; }
    public int Score { get; set; }
}

下面提供两种常用的LINQ实现方式,你可以根据习惯选择:

方法一:LINQ查询表达式(可读性更强)

这种写法逻辑清晰,适合新手快速理解左连接的原理:

// 指定要查询的目标用户ID
int targetUserId = 898128;

var queryResult = from entry in Entries
                  // 左连接用户参赛表,将匹配结果分组
                  join userEntry in UserEntries
                      on entry.Id equals userEntry.EntryId
                      into userEntryGroup
                  // 处理分组为空的情况(即用户未参与该赛事)
                  from matchedUserEntry in userEntryGroup.DefaultIfEmpty()
                  // 筛选指定用户的记录,同时保留未参赛的赛事条目
                  where matchedUserEntry == null || matchedUserEntry.UserId == targetUserId
                  // 构造返回结果
                  select new
                  {
                      EntryId = entry.Id,
                      EntryName = entry.Name,
                      // 未参赛时返回null
                      UserScore = matchedUserEntry?.Score
                  };

关键说明:

  • join ... into是LINQ实现左连接的核心语法,它会把匹配的UserEntry记录分组到对应的Entry下
  • DefaultIfEmpty()确保即使用户没有该赛事的参赛记录,也会保留原赛事条目
  • Where条件里必须判断matchedUserEntry == null,不然会把未参赛的赛事过滤掉,变成内连接

方法二:LINQ方法链(更简洁高效)

如果习惯链式调用的写法,这种方式更紧凑,而且可以提前筛选目标用户的参赛记录,优化查询性能:

int targetUserId = 898128;

var queryResult = Entries
    .GroupJoin(
        // 先筛选出目标用户的所有参赛记录,减少关联数据量
        UserEntries.Where(ue => ue.UserId == targetUserId),
        entry => entry.Id,
        userEntry => userEntry.EntryId,
        // 关联后构造结果
        (entry, userEntries) => new
        {
            EntryId = entry.Id,
            EntryName = entry.Name,
            // 取该用户在赛事中的得分,无记录则返回null
            UserScore = userEntries.Select(ue => ue.Score).FirstOrDefault()
        });

关键说明:

  • GroupJoin本身就是左连接的实现方式,直接将Entry和对应的UserEntry分组关联
  • 提前对UserEntries做Where(ue => ue.UserId == targetUserId)过滤,避免全表关联,性能更优
  • 假设每个用户每个赛事只有一条得分记录,用FirstOrDefault()就能快速拿到结果;如果存在多条记录,可以改成Average()/Max()等聚合逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:34:32