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

使用C#调用Graph API筛选SharePoint列表项时遇无效筛选子句错误

解决SharePoint列表筛选的BadRequest错误

问题场景

在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);
    }
}

关键说明

  1. 字段引用规则:所有SharePoint列表列必须通过fields/列名的格式引用,带空格的列名需额外用单引号包裹(如fields/'Employee Name')。
  2. 单引号转义:若筛选值包含单引号,必须替换为两个单引号,否则会破坏筛选语句的语法结构。
  3. PowerShell代码修正:原URL中的&=fields/$filterExpressions是错误写法,正确应为&$filter=$filterQuery,实际运行时可能已隐性修正。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:29:58