Query Options的一些用法(1): 展开用户列信息
每个SharePoint开发者打交道很多的一个肯定是使用CAML查询。针对一个非服务端开发,为了查询到想要的数据,不得不依赖CAML。
只要使用CAML查询,没有没有用过下面的方法的。从官方文档看,一个典型的查询包含了如下的参数。
public XmlNode GetListItems (
string listName,
string viewName,
XmlNode query,
XmlNode viewFields,
string rowLimit,
XmlNode queryOptions,
string webID
)
列表名,视图名,CAML查询,ViewFields(汗,不会翻译…), 限制返回记录数,查询选项,对应站点ID。
其中有点意思的是Query Options(查询选项)。官方文档给出了几个常用的用法。问题是,这些就是全部吗?有没有别的有意思的可以挖掘呢?
一起看看吧。
首先建立一个最简单的列表,添加一条数据。
写一个很简单的Console
/// <summary>
/// 查询所有的数据
/// </summary>
static XmlNode QueryAll
{
get
{
XmlElement query = _camlDoc.CreateElement("Query");
System.Text.StringBuilder querySB = new System.Text.StringBuilder();
querySB.Append(" <Where>");
querySB.Append(" <Neq>");
querySB.Append(" <FieldRef Name=\"ID\" />");
querySB.Append(" <Value Type=\"Counter\">0</Value>");
querySB.Append(" </Neq>");
querySB.Append(" </Where>");
query.InnerXml = querySB.ToString();
return query;
}
}
static void Main(string[] args)
{
Lists client = new Lists();
client.Url = webUrl + "/_vti_bin/lists.asmx";
client.Credentials = System.Net.CredentialCache.DefaultCredentials;
XmlNode resultNode = client.GetListItems(listName, String.Empty, QueryAll, null, "0", null, String.Empty);
Console.ReadLine();
}
运行,得到如下结果,包含的列表的一条数据。
<rs:data ItemCount="1" xmlns:rs="urn:schemas-microsoft-com:rowset">
<z:row ows_Title="Test01" ows_MetaInfo="1;#" ows__ModerationStatus="0" ows__Level="1" ows_ID="1" ows_UniqueId="1;#{E1F2046C-16AC-4650-8EE3-73E12ED5E833}" ows_owshiddenversion="1" ows_FSObjType="1;#0" ows_Created="2012-11-30 01:37:17" ows_PermMask="0x7fffffffffffffff" ows_Modified="2012-11-30 01:37:17" ows_FileRef="1;#teams/smetechcom/Lists/QueryOptionsDemo/1_.000" xmlns:z="#RowsetSchema" />
</rs:data>
现在,增加View Fields,引入Author和Editor。这两个是UserField的类型。
static XmlNode ViewFields
{
get
{
XmlElement viewFields = _camlDoc.CreateElement("ViewFields");
System.Text.StringBuilder viewFieldsSB = new System.Text.StringBuilder();
#region View Fields
viewFieldsSB.Append(" <FieldRef Name=\"Title\" />");
viewFieldsSB.Append(" <FieldRef Name=\"Author\" />");
viewFieldsSB.Append(" <FieldRef Name=\"Editor\" />");
#endregion
string sResult = viewFieldsSB.ToString();
viewFields.InnerXml = viewFieldsSB.ToString();
return viewFields;
}
}
static void Main(string[] args)
{
Lists client = new Lists();
client.Url = webUrl + "/_vti_bin/lists.asmx";
client.Credentials = System.Net.CredentialCache.DefaultCredentials;
XmlNode resultNode = client.GetListItems(listName, String.Empty, QueryAll, ViewFields, "0", null, String.Empty);
Console.ReadLine();
}
运行,得到下面结果。
<rs:data ItemCount="1" xmlns:rs="urn:schemas-microsoft-com:rowset">
<z:row ows_Title="Test01" ows_Author="1;#Qin, Lei (Lambert, ES-Apps-GD-China-SH)" ows_Editor="1;#Qin, Lei (Lambert, ES-Apps-GD-China-SH)" ows_MetaInfo="1;#" ows__ModerationStatus="0" ows__Level="1" ows_ID="1" ows_UniqueId="1;#{E1F2046C-16AC-4650-8EE3-73E12ED5E833}" ows_owshiddenversion="1" ows_FSObjType="1;#0" ows_Created="2012-11-30 01:37:17" ows_PermMask="0x7fffffffffffffff" ows_Modified="2012-11-30 01:37:17" ows_FileRef="1;#teams/smetechcom/Lists/QueryOptionsDemo/1_.000" xmlns:z="#RowsetSchema" />
</rs:data>
这个时候,这条数据中创建者和修改者得信息就出来了。格式为"User Information List中的Id;#用户的显示名"。
问题来了,如果我们需要知道这个人对应的邮件或者域账号呢?很多时候,我们的方案都是要根据人去查找权限,查找邮箱。显然这么基本的信息是不够的。
一个解决方案是根据这个ID去查询User Information List,来得到用户的其他信息。
另外一个解决方案就是增加一个Query Options。
static XmlNode QueryOptions
{
get
{
XmlElement queryOptions = _camlDoc.CreateElement("QueryOptions");
queryOptions.InnerXml = "<ExpandUserField>True</ExpandUserField>";
return queryOptions;
}
}
static void Main(string[] args)
{
Lists client = new Lists();
client.Url = webUrl + "/_vti_bin/lists.asmx";
client.Credentials = System.Net.CredentialCache.DefaultCredentials;
XmlNode resultNode = client.GetListItems(listName, String.Empty, QueryAll, ViewFields, "0", QueryOptions, String.Empty);
Console.ReadLine();
}
再次运行看看,你会发现更加详细的信息直接通过web service返回了。返回的格式为:"User Information List中的Id;#用户显示名,#域账号,#邮箱,#leiq@hp.com,#用户显示名(?)"
<rs:data ItemCount="1" xmlns:rs="urn:schemas-microsoft-com:rowset">
<z:row ows_Title="Test01" ows_Author="1;#Qin,, Lei (Lambert,, ES-Apps-GD-China-SH),#ASIAPACIFIC\qinle,#leiq@hp.com,#leiq@hp.com,#Qin,, Lei (Lambert,, ES-Apps-GD-China-SH)" ows_Editor="1;#Qin,, Lei (Lambert,, ES-Apps-GD-China-SH),#ASIAPACIFIC\qinle,#leiq@hp.com,#leiq@hp.com,#Qin,, Lei (Lambert,, ES-Apps-GD-China-SH)" ows_MetaInfo="1;#" ows__ModerationStatus="0" ows__Level="1" ows_ID="1" ows_UniqueId="1;#{E1F2046C-16AC-4650-8EE3-73E12ED5E833}" ows_owshiddenversion="1" ows_FSObjType="1;#0" ows_Created="2012-11-30 01:37:17" ows_PermMask="0x7fffffffffffffff" ows_Modified="2012-11-30 01:37:17" ows_FileRef="1;#teams/smetechcom/Lists/QueryOptionsDemo/1_.000" xmlns:z="#RowsetSchema" />
</rs:data>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端