如何在使用客户端OM查询列表时以动态方式生成/指定我要加载的项目字段列表?
这可以使用CAML查询上的标记,但这会加载其他不需要的字段,从而使有效负载更大。见这里:http://blogs.technet.com/b/speschka/archive/2009/11/01/using-the-sharepoint-2010-client-object-model-part-3.aspx
以下是我正在使用的测试代码:
ClientContext clientContext = new ClientContext("http://myserver/sites/mysite");
Web site = clientContext.Web;
List list = clientContext.Web.Lists.GetByTitle("MyList");
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = "<View Scope='RecursiveAll'><RowLimit>100</RowLimit></View>";
ListItemCollection listItems = list.GetItems(camlQuery);
clientContext.Load(listItems,
items => items.ListItemCollectionPosition,
items => items.Include(
item => item["ID"],
item => item["Title"]
));
clientContext.ExecuteQuery();
我想要做的是在运行时为Include方法生成lambda表达式。仍然没有运气。我尝试的每个解决方案都给出了错误“不支持查询表达式。”
答案 0 :(得分:0)
您可以使用稍后要查询的列创建特定视图,并在调用GetItems方法时使用该视图。
答案 1 :(得分:0)
我建议你使用免费的CAMLDesigner(http://sharepoint.biwug.be/SitePages/Caml_Designer.aspx) - 在那里你可以创建你的caml并在一个漂亮的GUI中检查结果。
答案 2 :(得分:0)
如果要通过CamlQuery动态指定要加载的字段,可以在循环中加载每个字段:
var array = new string[] { "ID", "Title" }; // define dynamically, this is just an example
foreach (var field in array)
{
clientContext.Load(listItems, includes => includes.Include(i => i[field]));
}
生成的查询与一个Load方法中的多个lambda表达式非常相似。
clientContext.Load(listItems, includes => includes.Include(i => i["ID"], i => i["Title"]));
两者都生成查询:
<Query Id="#" ObjectPathId="#">
<Query SelectAllProperties="false">
<Properties />
</Query>
<ChildItemQuery SelectAllProperties="false">
<Properties>
<Property Name="ID" ScalarProperty="true" />
<Property Name="Title" ScalarProperty="true" />
</Properties>
</ChildItemQuery>
</Query>