我正在学习 Azure 用户课程。在属性businessPhones的用户类中,我看到如下评论
/**
* The Business Phones.
* The telephone numbers for the user. NOTE: Although this is a string collection, only one number can be set for this property. Read-only for users synced from on-premises directory. Returned by default. Supports $filter (eq, not, ge, le, startsWith).
*/
@SerializedName(value = "businessPhones", alternate = {"BusinessPhones"})
@Expose
@Nullable
public java.util.List<String> businessPhones;
评论中的这句话提到我们可以在businessPhones列上使用startsWith。但是当我尝试使用startswith时出现以下错误。
还尝试了另一种方式,就像我们用于字符串的方式一样,如下所示。但还是报错
我们只能对 String 类型使用startsWith吗?我们不能将startswith 用于商务电话吗?
也浏览过此链接 在 Microsoft Graph 中按手机或商务手机筛选用户
我问这个问题的原因是我有一个方法,可以使用传递给该方法的搜索字段动态构建我的搜索查询。搜索字段是来自 azure 用户对象的属性
我的搜索字段如下
azure.user.attributes=givenName,displayName,surname,mail,userPrincipalName,onPremisesSamAccountName,jobTitle,mobilePhone,officeLocation,preferredLanguage,businessPhones
我的代码如下
private String getFilterQuery(SearchCriteria searchCriteria) {
StringBuilder filterQuery = new StringBuilder();
List<String> searchFields = searchCriteria.getSearchFields();
if (searchFields.size() > 0) {
for (String searchField : searchFields) {
filterQuery.append("startswith(");
filterQuery.append(searchField);
filterQuery.append(",");
filterQuery.append("'");
filterQuery.append(searchCriteria.getSearchText());
filterQuery.append("')");
filterQuery.append(" or ");
}
return (filterQuery.lastIndexOf(" or ") > -1)
? filterQuery.substring(0, filterQuery.lastIndexOf(" or ")).toString()
: filterQuery.toString();
}
}
SearchCriteria 是我的自定义对象,如下
public class SearchCriteria {
private List<String> searchFields = new ArrayList<>();
private String searchText;
public String getSearchText() {
return searchText;
}
public void setSearchText(String searchText) {
this.searchText = searchText;
}
public List<String> getSearchFields() {
return searchFields;
}
public void setSearchFields(List<String> searchFields) {
this.searchFields = searchFields;
}
最后查询是这样的
"startswith(givenName,'" + searchCriteria.getSearchText() + "') " + " or startswith(mail,'"
+ searchCriteria.getSearchText() + "') " + " or startswith(surname,'" + searchCriteria.getSearchText()
+ "') " + " or startswith(displayName,'" + searchCriteria.getSearchText() + "') "
+ " or startswith(userPrincipalName,'" + searchCriteria.getSearchText() + "') "
+ " or startswith(onPremisesSamAccountName,'" + searchCriteria.getSearchText() + "')";
当businessPhones是属性的一部分并且上面的查询包含像这样的businessPhones时,它会失败
or startswith(businessPhones,'" + searchCriteria.getSearchText() + "'
当包含 BusinessPhones 时,我是否应该为该特定字段构建不同的查询。
有人写了一篇博客,我在评论部分提到过。尝试了博客中提到的方法,但没有成功。
出现以下错误
生成的查询是这样的
https://graph.microsoft.com/v1.0/users?$filter=any(t: businessPhones : startswith(t, 'avi')) or startswith(givenName,'avi') or startswith(displayName,'avi') or startswith(surname,'avi') or startswith(mail,'avi') or startswith(userPrincipalName,'avi') or startswith(onPremisesSamAccountName,'avi') or startswith(jobTitle,'avi') or startswith(mobilePhone,'avi') or startswith(officeLocation,'avi') or startswith(preferredLanguage,'avi')&$count=true
唯一的工作方式就是这样
有任何帮助/建议请
注意:
businessPhone
属性的类型是字符串的集合,它像数组一样存储值。请参阅此MsDoc
当我尝试在我的环境中重现相同的情况时,我注册了一个用户,如下所示:
门户用户刀片:
我使用下面的命令来获取该用户,但我得到了相同的输出:
GET https://graph.microsoft.com/v1.0/users?$filter=businessPhones/any(x: startswith(x,'a'))&$count=true
回应:
要解决此错误,需要确保
businessPhone
值必须以“a”开头才能使用$filter(startsWith)
:
门户用户刀片:
GET https://graph.microsoft.com/v1.0/users?$filter=businessPhones/any(x: startswith(x,'a'))&$count=true
回复:
参考: