SharePoint 2013 中使用 CAML 的Membership 条件

SharePoint 2013 中使用 CAML 的Membership 条件。

Membership 用判断用户是否属于某个组, 适用于SP组, AD组,AD组嵌套在SP组中的各种情况。

以下过滤条件表示过滤出当前用户属于AssignedTo这个字段的组(P组, AD组,AD组嵌套在SP组)的纪录:

<Membership Type="CurrentUserGroups">
    <FieldRef Name="AssginedTo"/>
</Membership>

其中这个Type 有若干值

  • SPWeb.AllUsers
  • SPGroup
  • SPWeb.Groups
  • CurrentUserGroups
  • SPWeb.Users
为了说明这五种值的用法,这里需要一些测试数据:

Groups :

Test Owners (ID 5, 包含User 1)

Test Members  (ID 7, 不包含任何用户)

Subtestgroup

Users :

 User 1 :

Current user(当前用户)

Member of “Test Owners” and “subtestgroup”

User 2

rights granted directly on the subtestsite.

一个Task列表:

T1 assigned to user1

T2 assigned to test owners

T3 assigned to subtestgroup

T4 assigned to user2

T5 assigned to test members

以本文开头的CAML为例,不同的Type值结果如下

1. SPWeb.AllUsers  过滤出直接分配给用户(不通过Group)的Task

   过滤结果为 T1, T4


2. SPGroup, 过滤出直接分配给某个组的用户的Task, 需要指定组的ID

<Membership Type="SPGroup" ID="7">

<FieldRef Name="AssignedTo"/>

</Membership>

以上查询没有结果

<Membership Type="SPGroup" ID="7">

<FieldRef Name="AssignedTo"/>

</Membership>
以上查询结果为T1


3. SPWeb.Groups , 过滤出分配给用户组(不含子站点的组)的Task

<Membership Type="SPWeb.Groups">

<FieldRef Name="AssignedTo"/>

</Membership>

结果为 T2, T5


4. SPWeb.Users , 过滤出分配给不属于任何用户组的用户的Task

<Membership Type="SPWeb.Users">

<FieldRef Name="AssignedTo"/>

</Membership>

结果为 T4


5. CurrentUserGroups,过滤出通过用户组分配给当前用户的 Task,注意直接分配给用户的不会出现在结果中

<Membership Type="CurrentUserGroups">

<FieldRef Name="AssignedTo"/>

</Membership>

结果为T2, T3

但是AssignedTo通常既可以分配给组,也可以直接分配用户,那么如何查询出分配给这个用户的Task呢,包含通过组分配和直接分配的。

直接分配给当前用户的Task可以用以下Caml来查询

<Eq>
<FieldRef Name='AssginedTo'  LookupId='TRUE'/>
 <Value Type='Lookup'><UserID/></Value>
</Eq>

结果为T1

那么查询出分配给这个用户的Task就可以使用Or把上面两种情况连接起来

<Query>
<Where>
<Or>
<Membership Type="CurrentUserGroups">
    <FieldRef Name="Audience"/>
</Membership>
<Eq>
<FieldRef Name='AssginedTo'  LookupId='TRUE'/>
 <Value Type='Lookup'><UserID/></Value>
</Eq>
</Or>
</Where>
</Query>
结果为T1,T2, T3

可能有博友会问,这种情况会不会出现某个组ID和用户ID相同而出现bug,因为Group和User都是LookUP字段。

比如一个GroupA ID 为5,当前用户ID也是5,这个Task 分配给了GroupA ,但是并没有分配给当前用户,以上CAML可以把这个Task也查出来。

实际上Group ID和 User ID是不会重复的,可以做个小实验:

a. /_layouts/userdisp.aspx?ID=15 用户查看用户ID为15的用户信息。

b. 如果有某个Group ID 为5,可以访问/_layouts/userdisp.aspx?ID=5 页面会自动跳转到/_layouts/people.aspx?MembershipGroupId=5



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 SharePoint Java SDK 连接 SharePoint 并读取列表数据的示例代码: ```java import com.microsoft.sharepoint.*; import java.net.URL; public class SharePointExample { public static void main(String[] args) { try { // Connect to SharePoint site String siteUrl = "http://sharepoint.example.com/"; String username = "username"; String password = "password"; SharePointOnlineCredentials creds = new SharePointOnlineCredentials(username, password); Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password.toCharArray()); } }); URL url = new URL(siteUrl); ClientContext ctx = new ClientContext(url); ctx.setCredentials(creds); // Read list data List list = ctx.getWeb().getLists().getByTitle("ListTitle"); CamlQuery query = new CamlQuery(); ListItemCollection items = list.getItems(query); ctx.load(items); ctx.executeQuery(); // Process list data for (ListItem item : items) { System.out.println(item.getFieldValueAsText("Title")); } } catch (Exception e) { e.printStackTrace(); } } } ``` 这个示例演示了如何使用 SharePoint Java SDK 连接到 SharePoint 网站,并读取名为 "ListTitle" 的列表的数据。使用 SharePointOnlineCredentials 类提供用户名和密码进行身份验证。然后,使用 ClientContext 类连接到 SharePoint 网站,并使用 getItems() 方法检索列表项。最后,使用 load() 和 executeQuery() 方法加载和执行查询,然后使用 ListItem 类处理每个列表项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值