C# 中的 Microsoft Graph 搜索筛选字符串

Posted

技术标签:

【中文标题】C# 中的 Microsoft Graph 搜索筛选字符串【英文标题】:Microsoft Graph Search Filter String in C# 【发布时间】:2018-05-11 20:54:03 【问题描述】:

下面的请求适用于三重转义字符,但不适用于单个转义字符,所以如果我有以下内容:

string filter = "\"category <> \"Person\" AND category <> \"Person 2\""

上面打印的字符串会给我们:

filter = "category <> "Person" AND category <> "Person 2""

这不起作用,但下面的过滤器定义将起作用:

string filter =
    "\"category <> \\\"Person\\\" AND category <> \\\"Person2\\\"\"";

List<QueryOption> options = new List<QueryOption>

    new QueryOption("$search", filter)
;

var messages = graphClient.Me
    .MailFolders
    .Inbox
    .Messages
    .Request(options)
    .Select("id, Categories, Subject")
    .Top(500)
    .GetAsync()
    .Result;

打印的这个过滤器给我们:

filter = "category <> \"Person\" AND category <> \"Person 2\""

为什么我们在 API 调用的打印字符串中包含一个 \?有人可以解释一下吗?

如果 \ 是 Microsoft Graph 中的转义字符,那么这是有道理的,但 Graph 中的转义字符是另一个“。”。

【问题讨论】:

【参考方案1】:

让我们从这里开始。

new QueryOption("$search", filter)

我们在这里做的是准备一个$search 过滤器,它将被附加到一个 url 的 GET 参数中......类似这样。

https://...endpoint?$search=filter

如果最终字符串中没有转义......它看起来像这样

https://...endpoint?$search=category 人物 AND 类别 人物 2

这不是很好。我们需要在字符串周围加上双引号

https://...endpoint?$search=category "Person" AND category "Person 2"

更好,但我们需要在整个过滤器周围加上引号

https://...endpoint?$search="category "Person" AND category "Person 2""

哇!现在我们的过滤器在开头和结尾包含双引号,以及嵌套字符串周围的双引号。好的,让我们转义内部双引号。

https://...endpoint?$search="category \"Person\" AND category \"Person 2\""

所以现在我们知道我们需要构建这个字符串。

"类别 \"Person\" AND 类别 \"Person 2\""

在 C# 中我们有几个选择...我们可以使用普通字符串,这意味着我们需要永远转义 \"

var x = "\"category <> \\\"Person\\\" AND category <> \\\"Person 2\\\"";

或者,您可以使用 Verbatim 字符串。它会减少转义的数量,因为您不需要转义斜线。在逐字字符串中,双引号被转义为 2 个连续的双引号

var y = @"""category <> \""Person\"" AND category <> \""Person 2\""";

【讨论】:

谢谢 Eoin,这是发送给请求的最终 url 吗? "category \"Person\" AND category \"Person 2\"" ?【参考方案2】:

您是否尝试过使用 Uri.EscapeDataString() 方法将字符串转义为 URL 友好字符?

var filter = Uri.EscapeDataString($"\"category <> \"Person\" AND category <> \"Person 2\"");

这会将字符串变成:

%22category%20%3C%3E%20%22Person%22%20AND%20category%20%3C%3E%20%22Person%202%22

【讨论】:

以上是关于C# 中的 Microsoft Graph 搜索筛选字符串的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Graph 驱动器搜索

Microsoft Graph API SharePoint 搜索

使用 microsoft graph api c# 创建在线会议时出现 404 错误,但未登录 AzureActiveDirectory

在哪里可以找到 Microsoft Graph API 中的“发送为”和“代表发送”邮件设置?

为 Microsoft Graph 创建与“包含”等效的筛选查询

MS Graph API:microsoft.graph.createLink 未创建匿名视图链接