CAML查询操作员中值的限制
-
10-12-2019 - |
题
我在我的图书馆里有少于5000个项目。我想通过IDS获得530个项目。所以我正在使用以下查询。
<Where>
<In>
<FieldRef Name="ID" />
<Values>
<Value Type="Number">1</Value>
<Value Type="Number">2</Value>
.
.
.
<Value Type="Number">530</Value>
</Values>
</In>
</Where>
.
如果我在列表上使用此查询,则在发生异常之后迭代SplistItemCollection时。
System.ArgumentException: Value does not fall within the expected range.
at Microsoft.SharePoint.Library.SPRequestInternalClass.GetListItemDataWithCallback2(IListItemSqlClient pSqlClient, String bstrUrl, String bstrListName, String bstrViewName, String bstrViewXml, SAFEARRAYFLAGS fSafeArrayFlags, ISP2DSafeArrayWriter pSACallback, ISPDataCallback pPagingCallback, ISPDataCallback pPagingPrevCallback, ISPDataCallback pFilterLinkCallback, ISPDataCallback pSchemaCallback, ISPDataCallback pRowCountCallback, Boolean& pbMaximalView)
at Microsoft.SharePoint.Library.SPRequest.GetListItemDataWithCallback2(IListItemSqlClient pSqlClient, String bstrUrl, String bstrListName, String bstrViewName, String bstrViewXml, SAFEARRAYFLAGS fSafeArrayFlags, ISP2DSafeArrayWriter pSACallback, ISPDataCallback pPagingCallback, ISPDataCallback pPagingPrevCallback, ISPDataCallback pFilterLinkCallback, ISPDataCallback pSchemaCallback, ISPDataCallback pRowCountCallback, Boolean& pbMaximalView)
at Microsoft.SharePoint.SPListItemCollection.EnsureListItemsData()
at Microsoft.SharePoint.SPListItemCollection.GetEnumerator()
.
如果我重新运行查询,则在操作员中的值少于500,那么SplistItemcollection不会抛出异常。
操作员中的CAML是否具有少于相等的500项的限制?或者有其他更好的方法。
解决方案
它肯定从你的故事看起来如此,但是没有一个非常容易的解决方法?
<Where>
<Or>
<In>
<FieldRef Name="ID" />
<Values>
<Value Type="Number">1</Value>
<Value Type="Number">2</Value>
.
.
.
<Value Type="Number">499</Value>
</Values>
</In>
<In>
<FieldRef Name="ID" />
<Values>
<Value Type="Number">500</Value>
<Value Type="Number">501</Value>
.
.
.
<Value Type="Number">999</Value>
</Values>
</In>
</Or>
</Where>
.
等,如果超过1000且依此类推,则更有嵌套。
其他提示
由于低代表如此发布为答案而无法评论,纯粹主义者原谅。
将500个元素分成几个嵌套或标签不起作用,到我的绝望。极限是明显的500个元素。
我尝试使用500个元素的限制,400,300,200,100和spservices查询失败,返回:500个内部服务器错误,以下响应:
Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.
.
尝试最多更新500个元素(使用单个标签或使用嵌套或每400,300,00,000,100元素分解)。然后查询返回200的成功。据我所知,嵌套或标签也应该有一些限制。
我正在使用:spservices 2014.01,jQuery 1.11,SharePoint 2013:
$().SPServices.SPUpdateMultipleListItems({
listName: "some list display name",
CAMLQuery: CAMLQuery,
valuepairs: [["static name of the field", 1]],
completefunc: function (xData) {
if (xData.status !== 200) {
console.log("failure");
}
}
});
.
示例查询5 * 100 + 1失败,因为有501个元素:
<Query>
<Where>
<Or>
<In>
<FieldRef Name='ID' LookupId='TRUE' />
<Values>
100 times <Value Type='Lookup'>2688</Value>
</Values>
</In>
<Or>
<In>
<FieldRef Name='ID' LookupId='TRUE' />
<Values>
100 times value
</Values>
</In>
<Or>
<In>
<FieldRef Name='ID' LookupId='TRUE' />
<Values>
100 times value
</Values>
</In>
<Or>
<In>
<FieldRef Name='ID' LookupId='TRUE' />
<Values>
100 times value
</Values>
</In>
<Or>
<In>
<FieldRef Name='ID' LookupId='TRUE' />
<Values>
100 times value
</Values>
</In>
<In>
<FieldRef Name='ID' LookupId='TRUE' />
<Values>
<Value Type='Lookup'>3089</Value>
</Values>
</In>
</Or>
</Or>
</Or>
</Or>
</Or>
</Where>
</Query>
. 也无法评论,但是在面对这种类型的情况时,我做了什么(是的,我遇到了这个限制),是使用min和max的min 运行查询
<Where>
<And>
<Geq><FieldRef Name='ID' /><Value Type='Counter'>x</Value></Geq>
<Leq><FieldRef Name='ID' /><Value Type='Counter'>y</Value></Leq>
</And>
</Where>
.
然后,假设我有我实际在某种类型的枚举中确实想要的IDS,请使用LINQ获取您实际从查询结果中确实所需的项目。