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
Test Owners (ID 5, 包含User 1)Test Members (ID 7, 不包含任何用户)
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