使用 Caml 过滤 Sharepoint 列表时出现问题
Trouble Filtering Sharepoint List with Caml
我正在尝试过滤 SharePoint 列表,以便仅显示包含字符串的管理字段的项目,如 "Yes",但每当我到达 ctx.ExecuteQuery () 语句,我的程序炸毁了。我相信我的 CAMLQuery 结构正确,所以我不确定是我只是用错了它还是遗漏了什么。任何帮助都会很棒!谢谢!我目前拥有的代码发布在下面:
Web myWeb = ctx.Web;
List myList = myWeb.Lists.GetByTitle("Company Employees");
SPClient.View view = myList.DefaultView;
CamlQuery qry = new CamlQuery();
qry.ViewXml = "<Query>" + "< Where >" + "<Eq>" + "< FieldRef Name='Management'/>" + "< Value Type='Text'>Yes</ Value >" + "</Eq>" + "</ Where >" + "</ Query >";
myList.GetItems(qry);
ListItemCollection listItems = myList.GetItems(qry);
ctx.Load(listItems);
ctx.ExecuteQuery();
您的代码似乎缺少 <View>
标记,该标记会环绕您在 CAML 中的 <Query>
标记。
添加 <View>
根元素后,正确的 CAML XML 如下所示:
qry.ViewXml =
"<View>"+
"<Query>"+
"<Where>"+
"<Eq>"+
"<FieldRef Name='Management'/>"+
"<Value Type='Text'>Yes</Value>"+
"</Eq>"+
"</Where>"+
"</Query>"+
"</View>";
其他疑难解答
为了帮助解决问题,您可以通过 JavaScript 客户端对象模型尝试 运行 相同的查询。
- 在 Internet Explorer 中访问 SharePoint 网站并按 F5 打开开发人员工具。
- 在控制台选项卡上,输入以下代码行并执行(按 Enter 或 Ctrl+一次输入)他们一行:
-
var ctx = new SP.ClientContext();
var list = ctx.get_web().get_lists().getByTitle("Company Employees");
var qry = new SP.CamlQuery();
qry.set_viewXml("<View><Query><Where><Eq><FieldRef Name=\"Management\"/><Value Type=\"Text\">Yes</Value></Eq></Where></Query></View>");
var items = list.getItems(qry);
ctx.load(items);
ctx.executeQueryAsync(function(){alert("success!");},function(sender,args){alert(args.get_message());});
POST 帮助解决方案感谢您的帮助,我能够弄清楚如何使用以下代码创建具有所需过滤的新视图。主要问题出在 Caml 查询上——我必须删除 和 标签,然后在创建视图之前删除几行。以下是我的工作解决方案:
Web myWeb = ctx.Web;
List myList = myWeb.Lists.GetByTitle("Company Employees");
SPClient.View view = myList.DefaultView;
CamlQuery qry = new CamlQuery();
qry.ViewXml =
"<Where><Eq><FieldRef Name=\"Management\"/><Value Type='Text'>Yes</Value></Eq></Where>";
ViewCollection viewColl = myList.Views;
string[] viewFields = { "Title", "Promoted", "Intern", "Management" };
ViewCreationInformation creationInfo = new ViewCreationInformation();
creationInfo.Title = "Management";
creationInfo.RowLimit = 50;
creationInfo.ViewFields = viewFields;
creationInfo.ViewTypeKind = ViewType.None;
creationInfo.SetAsDefaultView = false;
creationInfo.Query = qry.ViewXml;
viewColl.Add(creationInfo);
ctx.ExecuteQuery();
我正在尝试过滤 SharePoint 列表,以便仅显示包含字符串的管理字段的项目,如 "Yes",但每当我到达 ctx.ExecuteQuery () 语句,我的程序炸毁了。我相信我的 CAMLQuery 结构正确,所以我不确定是我只是用错了它还是遗漏了什么。任何帮助都会很棒!谢谢!我目前拥有的代码发布在下面:
Web myWeb = ctx.Web;
List myList = myWeb.Lists.GetByTitle("Company Employees");
SPClient.View view = myList.DefaultView;
CamlQuery qry = new CamlQuery();
qry.ViewXml = "<Query>" + "< Where >" + "<Eq>" + "< FieldRef Name='Management'/>" + "< Value Type='Text'>Yes</ Value >" + "</Eq>" + "</ Where >" + "</ Query >";
myList.GetItems(qry);
ListItemCollection listItems = myList.GetItems(qry);
ctx.Load(listItems);
ctx.ExecuteQuery();
您的代码似乎缺少 <View>
标记,该标记会环绕您在 CAML 中的 <Query>
标记。
添加 <View>
根元素后,正确的 CAML XML 如下所示:
qry.ViewXml =
"<View>"+
"<Query>"+
"<Where>"+
"<Eq>"+
"<FieldRef Name='Management'/>"+
"<Value Type='Text'>Yes</Value>"+
"</Eq>"+
"</Where>"+
"</Query>"+
"</View>";
其他疑难解答
为了帮助解决问题,您可以通过 JavaScript 客户端对象模型尝试 运行 相同的查询。
- 在 Internet Explorer 中访问 SharePoint 网站并按 F5 打开开发人员工具。
- 在控制台选项卡上,输入以下代码行并执行(按 Enter 或 Ctrl+一次输入)他们一行:
-
var ctx = new SP.ClientContext();
var list = ctx.get_web().get_lists().getByTitle("Company Employees");
var qry = new SP.CamlQuery();
qry.set_viewXml("<View><Query><Where><Eq><FieldRef Name=\"Management\"/><Value Type=\"Text\">Yes</Value></Eq></Where></Query></View>");
var items = list.getItems(qry);
ctx.load(items);
ctx.executeQueryAsync(function(){alert("success!");},function(sender,args){alert(args.get_message());});
POST 帮助解决方案感谢您的帮助,我能够弄清楚如何使用以下代码创建具有所需过滤的新视图。主要问题出在 Caml 查询上——我必须删除 和 标签,然后在创建视图之前删除几行。以下是我的工作解决方案:
Web myWeb = ctx.Web;
List myList = myWeb.Lists.GetByTitle("Company Employees");
SPClient.View view = myList.DefaultView;
CamlQuery qry = new CamlQuery();
qry.ViewXml =
"<Where><Eq><FieldRef Name=\"Management\"/><Value Type='Text'>Yes</Value></Eq></Where>";
ViewCollection viewColl = myList.Views;
string[] viewFields = { "Title", "Promoted", "Intern", "Management" };
ViewCreationInformation creationInfo = new ViewCreationInformation();
creationInfo.Title = "Management";
creationInfo.RowLimit = 50;
creationInfo.ViewFields = viewFields;
creationInfo.ViewTypeKind = ViewType.None;
creationInfo.SetAsDefaultView = false;
creationInfo.Query = qry.ViewXml;
viewColl.Add(creationInfo);
ctx.ExecuteQuery();