2010-05-20 24 views
5

查询“创建人”字段嘿,我有一个管理员插入用户名(“域\名称”)的表单,代码获取并设置一些信息。SharePoint的CAML使用用户名

这是一个庞大的项目,其中一些列表包含用户名作为字符串(“域\名称”),但有些列表只会计入自动创建的“创建者”列。

我想知道什么是使用用户名字符串查询这些列表的最快方法。我试图使用相同的查询作为一个我使用的第一类名单的,它显然没有奏效 -

<Where><Eq><FieldRef Name='UserName'/><Value Type='Text'>domain\\username</Value></Eq></Where> 

谢谢。

回答

16

有两个不同的“创建者”字段,一个用于所有项目,另一个专用于文档库(“创建文档”)。 “创建者”字段的内部名称是“作者”,因此<FieldRef Name='Author'/>将是最好的开始。第二个字段是文档库中实际文件的作者,其内部名称为“Created_x0020_By”。从你的情景判断,我有一种感觉,你只需要前者,但无论如何,后者知道的很好,因为存储在它们中的数据是不同的。

“创建者”是一个用户字段,所以其数据的字符串版本是ID;#Full Name。同时,“文档创建者”是单行文本的文本字段,其数据作为实际用户名(包含域,如果适用)存储。因此,您的上述查询将适用于文档库并在<FieldRef Name='Created_x0020_By'/>上进行搜索。但是,如果您想在“创建者”字段上进行搜索,则必须有点棘手,但您应该可以通过引用用户的SharePoint ID来完成它。以下是我用于比较的一个不同的用户字段查询的示例。

<Eq><FieldRef Name='AssignedTo' /><Value Type='Integer'><UserID Type='Integer' /></Value></Eq> 

这个具体过滤了当前用户。要将其用于您的目的,请将'AssignedTo'替换为'作者',并用相关用户的ID替换<UserID Type='Integer' />

+0

谢谢。我有第一个场景,即试图通过作者列查询简单列表,只有一个用户名。我设法创建了一个SPUser对象,并用“Author”和user.ID尝试了你的查询,但是我得到一个异常,说“当转换为nvarchar值'SomeFirstname SomeLastname'为数据类型int。”时,转换失败,其中“SomeFirstname SomeLastname”是列表中不是用户名的名称。 希望你的帮助:) – yellowblood 2010-05-22 11:49:37

+2

nvm,修复它。当按ID查询“作者”列时,需要为“FieldRef”标签添加一个“LookupId ='True'”属性。 工作,非常感谢! – yellowblood 2010-05-22 12:23:34

7

我想提出以下建议:

  1. 通过调用EnsureUser方法获取SharePoint的用户,即:

    SPUser myUser = SPContext.Current.Web.EnsureUser(@"DOMAIN\USERNAME"); 
    
  2. 查询列表通过使用SharePoint用户的ID :

    SPQuery spQuery = new SPQuery(); 
    StringBuilder queryString = new StringBuilder(String.Empty); 
    queryString.Append(@"<Where>"); 
    queryString.Append(@" <Eq>"); 
    queryString.Append(@"  <FieldRef ID=""{1df5e554-ec7e-46a6-901d-d85a3881cb18}"" LookupId=""True"" />"); //Author Field 
    queryString.Append(@"  <Value Type=""Lookup"">" + myUser.ID + @"</Value>"); 
    queryString.Append(@" </Eq>"); 
    queryString.Append(@"</Where>"); 
    spQuery.Query = queryString.ToString(); 
    
  3. 针对列表启动查询

    myList.GetItems(spQuery);