使用C#调用Graph API筛选SharePoint列表项时遇无效筛选子句错误
问题场景
在SharePoint中有一个列表,使用C#基于指定条件(如title eq '4398439')获取数据,环境为Visual Studio 2019、.NET 5.0,执行代码时遇到Invalid filter clause的BadRequest错误。
当前C#代码
public async Task<int> FetchSharePointListItem(string siteId, string libraryName, Dictionary<string, string> matchCriteria) { try { var list = await Client.Sites[siteId].Lists.Request().Filter($"displayName eq '{libraryName}'").GetAsync(); string listId = list[0].Id; List<Option> options = new List<Option> { new HeaderOption("Prefer","HonorNonIndexedQueriesWarningMayFailRandomly") }; var filter = string.Join(" and ", matchCriteria.Select(kv => $"{kv.Key} eq '{kv.Value}'")); var items = await Client.Sites[siteId].Lists[listId].Items.Request(options).Filter(filter).GetAsync(); return items.Count; } catch (Exception ex) { throw new Exception(ex.Message); } }
错误信息
Exception: Code: BadRequest Message: Invalid filter clause Inner error: AdditionalData: date: 2023-05-19T15:54:32 request-id: 650048ff-9e76-4798-96ec-e3f4d50c7b1f client-request-id: 650048ff-9e76-4798-96ec-e3f4d50c7b1f ClientRequestId: 650048ff-9e76-4798-96ec-e3f4d50c7b1f
可正常运行的PowerShell代码
$filterExpressions = foreach ($entry in $MatchCriteria.GetEnumerator()) { $columnName = $entry.Key $columnValue = $entry.Value "$columnName eq '$columnValue'" } $selectFields = "Title,Username,OrgID,Firstname,MiddleName,LastName,Email" $filterQuery = $filterExpressions -join " and " $apiUrl = "https://graph.microsoft.com/v1.0/sites/$SiteId/lists/$ListId/items?expand=fields(select=$selectFields)&$filter=$filterQuery"
解决方案
核心问题
Graph API筛选SharePoint列表项时,必须针对fields属性下的列名构建筛选条件,直接使用列名会导致语法错误。PowerShell代码实际是通过$filter参数关联到fields字段,而原C#代码未做该关联。
修正后的C#代码
public async Task<int> FetchSharePointListItem(string siteId, string libraryName, Dictionary<string, string> matchCriteria) { try { var list = await Client.Sites[siteId].Lists.Request().Filter($"displayName eq '{libraryName}'").GetAsync(); string listId = list[0].Id; List<Option> options = new List<Option> { new HeaderOption("Prefer","HonorNonIndexedQueriesWarningMayFailRandomly") }; // 修正筛选逻辑:关联fields属性,处理列名特殊情况和值的单引号转义 var filter = string.Join(" and ", matchCriteria.Select(kv => { // 带空格/特殊字符的列名需用单引号包裹 var fieldName = kv.Key.Contains(" ") || !char.IsLetter(kv.Key[0]) ? $"'{kv.Key}'" : kv.Key; // 值中的单引号需转义为两个单引号 var fieldValue = kv.Value.Replace("'", "''"); return $"fields/{fieldName} eq '{fieldValue}'"; })); var items = await Client.Sites[siteId].Lists[listId].Items.Request(options).Filter(filter).GetAsync(); return items.Count; } catch (Exception ex) { throw new Exception(ex.Message); } }
关键说明
- 字段引用规则:所有SharePoint列表列必须通过
fields/列名的格式引用,带空格的列名需额外用单引号包裹(如fields/'Employee Name')。 - 单引号转义:若筛选值包含单引号,必须替换为两个单引号,否则会破坏筛选语句的语法结构。
- PowerShell代码修正:原URL中的
&=fields/$filterExpressions是错误写法,正确应为&$filter=$filterQuery,实际运行时可能已隐性修正。
内容的提问来源于stack exchange,提问作者Jseb
相关产品推荐
相关产品推荐

