使用CAML比较SharePoint“人员或组”字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CAML比较SharePoint“人员或组”字段相关的知识,希望对你有一定的参考价值。
我有一个SharePoint 2007(MOSS)列表,其中包含2个“人或组”列,我想比较一下,基本上:
SELECT * FROM List WHERE (Analyst = Developer)
在我的代码(C#)中,我将其构建为:
SPQuery itemQuery = new SPQuery();
itemQuery.Query = "<Where><Eq><FieldRef Name='Analyst' /><FieldRef Name='Developer' /></Eq></Where>";
SPListItemCollection queryResults = list.GetItems(itemQuery);
但这是抛出一个异常(“HRESULT异常:0x80020009(DISP_E_EXCEPTION)”)。
在与“人员或组”列进行比较时,我看到了一些关于Value元素的Type属性的信息,但没有关于将这两列中的两列相互比较的信息。
我也尝试在每个FieldRef中添加“LookupId ='TRUE'”,没有任何变化。
答案
无法比较使用CAML的两个字段。您必须使用文字值。这意味着,您可能会遇到两个问题:
- 检索Analyst / Developer的用户标识
- 检索Analyst和Developer相同的项目
#2的示例:
<Where>
<And>
<Eq><FieldRef Name="Analyst" LookupId="TRUE"/><Value Type="Integer">42</Value></Eq>
<Eq><FieldRef Name="Developer" LookupId="TRUE"/><Value Type="Integer">42</Value></Eq>
</And>
</Where>
仅供参考,您也可以使用<UserID/>
作为“当前用户”而不是用户ID(在本例中为42)。
另一答案
我相信你正在寻找的逻辑是这样的:
<Where>
<Eq>
<FieldRef Name='Analyst'/>
<Value Type="Text"><FieldRef Name='Developer'/></Value>
</Eq>
</Where>
我测试了这是不可能的,所以我认为这两个选项是:
- 获取所有列表项,然后使用查找迭代JQuery并比较两个相等的字段。
- 创建一个计算列,如果列中的两列相等,则设置true或false值,然后根据该列执行select。从性能角度来看,这可能是最权宜之计也是最有效的。
另一答案
试试这个:
<Where>
<Eq>
<FieldRef Name="Analyst" />
<Value Type="Text">Developer</Value>
</Eq>
</Where>
我找到了一个列表,它有两个匹配值可供比较,我得到了一个CAML查询来处理比较;但是,它是一个布尔值,所以我不确定这是否是你要找的。它确实比较了两个领域,但我认为文字仍然在阻碍。这个列表中有大约25个条目,这是唯一匹配的条目,所以我认为这将是一个很好的测试。
这是代码:
private DataTable ExecuteQuery(SPList list)
{
SPQuery qry = new SPQuery();
qry.Query = "<Where><And><Contains><FieldRef Name='Show' /><Value Type='Boolean'>1</Value></Contains><Contains><FieldRef Name='Highlight' /><Value Type='Boolean'>1</Value></Contains></And></Where>";
qry.ViewFields = "<FieldRef Name='Show' /><FieldRef Name='Highlight' />";
qry.IncludeMandatoryColumns = true;
return list.GetItems(qry).GetDataTable();
对不起,如果这不是你想要的。祝好运!!
以上是关于使用CAML比较SharePoint“人员或组”字段的主要内容,如果未能解决你的问题,请参考以下文章
SharePoint:如何使用列表中的 CAML 查询获取前 5 条记录
SharePoint服务器端对象模型 之 使用CAML进展数据查询