如何在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
相关产品推荐
相关产品推荐

