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

如何在Entity Framework中基于Id列获取匹配前缀的Google Sheets数据列表

实现Google Sheets Id列前缀匹配查询的解决方案

方案一:利用Google Sheets查询API在服务端过滤(推荐)

这种方式直接让Google Sheets服务器执行前缀匹配逻辑,仅返回符合条件的数据,性能更优,尤其适合数据量大的场景。

代码实现

修改ItemsGoogleSheetVATController中的GetID方法:

[HttpGet]
public IActionResult GetID(string id)
{
    if (string.IsNullOrWhiteSpace(id))
    {
        return BadRequest("Id参数不能为空");
    }

    // 处理单引号转义,避免QUERY语法错误
    var escapedId = id.Replace("'", "''");
    // 构造查询范围:覆盖工作表A到AG列
    var range = $"{SHEET_NAME}!A:AG";
    var request = _googleSheetValues.Get(SPREADSHEET_ID, range);
    
    // 使用Google Sheets QUERY语法实现前缀匹配:Col1对应A列(Id列)
    request.Query = $"select * where Col1 starts with '{escapedId}'";
    // 强制以格式化字符串返回值,避免数字自动转换导致匹配失败
    request.ValueRenderOption = ValuesResource.GetRequest.ValueRenderOptionEnum.FormattedValue;

    var response = request.Execute();
    var values = response.Values;
    
    if (values == null || values.Count == 0)
    {
        return NotFound("未找到匹配的数据");
    }

    // 跳过表头行(若你的Sheet第一行是表头)
    var items = ItemsGoogleSheetMapper.MapFromRangeData(values.Skip(1).ToList());
    return Ok(items);
}

关键说明

  • Col1对应工作表的A列(你的Id列),若Id在其他列,需调整为对应Col编号(如B列是Col2)
  • starts with是Google Sheets QUERY语言的前缀匹配关键字,确保只返回以指定id开头的行
  • 对输入的id做单引号转义,避免QUERY语法解析错误

方案二:拉取全部数据后在内存中过滤(适合小数据量)

如果数据量较小,可先拉取所有数据,再用LINQ的StartsWith方法做内存过滤:

代码实现

[HttpGet]
public IActionResult GetID(string id)
{
    if (string.IsNullOrWhiteSpace(id))
    {
        return BadRequest("Id参数不能为空");
    }

    var range = $"{SHEET_NAME}!A:AG";
    var request = _googleSheetValues.Get(SPREADSHEET_ID, range);
    request.ValueRenderOption = ValuesResource.GetRequest.ValueRenderOptionEnum.FormattedValue;
    
    var response = request.Execute();
    var values = response.Values;
    
    if (values == null || values.Count == 0)
    {
        return NotFound("未找到匹配的数据");
    }

    // 跳过表头,映射数据后执行前缀过滤
    var allItems = ItemsGoogleSheetMapper.MapFromRangeData(values.Skip(1).ToList());
    var matchedItems = allItems.Where(item => item.Id.StartsWith(id, StringComparison.OrdinalIgnoreCase)).ToList();

    return matchedItems.Count > 0 ? Ok(matchedItems) : NotFound("未找到匹配的数据");
}

关键说明

  • StringComparison.OrdinalIgnoreCase用于忽略大小写匹配,若需要严格区分大小写,可移除该参数
  • 数据量大时不推荐此方案,会增加网络传输开销和内存占用

额外注意事项

  • 确保Google Sheets的Id列设置为文本格式,避免系统自动把"0102"这类带前导零的字符串转换为数字102,导致匹配失败
  • 若Sheet没有表头行,需移除代码中的Skip(1)逻辑

内容的提问来源于stack exchange,提问作者Chim Di Tru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:40:31