使用CAML比较SharePoint“人员或组”字段

使用CAML比较SharePoint“人员或组”字段,sharepoint,sharepoint-2007,caml,Sharepoint,Sharepoint 2007,Caml,我有一份SharePoint 2007 MOSS列表,其中包含两个我想比较的个人或组列,基本上是: SELECT * FROM List WHERE (Analyst = Developer) 在我的代码C中,我将其构建为: SPQuery itemQuery = new SPQuery(); itemQuery.Query = "<Where><Eq><FieldRef Name='Analyst' /><FieldRef Name='Develop

我有一份SharePoint 2007 MOSS列表,其中包含两个我想比较的个人或组列,基本上是:

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

我已经看到了一些关于在比较Person或Group列时Value元素的Type属性的信息,但是没有看到任何关于比较这两个列的信息

我还尝试将LookupId='TRUE'添加到每个FieldRef,没有任何更改。

尝试以下操作:

<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比较两个类似的字段。您必须使用文字值。这意味着您可能有两个查询:

检索分析人员/开发人员的用户ID 检索分析师和开发人员相同的项目 示例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>

仅供参考,您也可以使用当前用户,而不是本例中的用户ID,42。

我相信,您正在寻找的逻辑是:

<Where>
   <Eq>
      <FieldRef Name='Analyst'/>
      <Value Type="Text"><FieldRef Name='Developer'/></Value>
   </Eq>
</Where>
我进行了测试,但这是不可能的,因此我认为有两个选项:

获取所有列表项,然后使用JQuery进行迭代,查找并比较两个字段是否相等

创建一个计算列,如果列表中的两列相等,则该列将设置true或false值,然后根据该列进行选择。从性能的角度来看,这可能是最方便也是最有效的方法


我不想比较一个字段和一个文本值,而是比较两个字段的值。一名字段名分析师和一名指定开发人员。感谢您的更新建议,但您的第二个CAML不是从Show包含1和Highlight包含1的列表中选择*的等效对象吗?放纵自己。如果是这样,那也没什么帮助,因为我不在乎Show和Highlight的价值是什么,只是它们是一样的。谢谢你的建议和后续行动!我的具体要求是能够指定在运行时比较哪些字段,因此我最终采用了一种方法,该方法采用无效的CAML语句,解析它以将无效部分替换为查询结果,然后运行结果查询。它很难看,但至少它能工作。谢谢你的回复。不幸的是,我的问题的正确答案似乎是这是不可能的。正如我在另一篇评论中提到的,我在运行时用另一个使用C和大量字符串函数的CAML查询的结果替换了示例中的值42,从而解决了这个问题