使用 CamlQuery 和 ListItemCollectionPosition 在分页结果中首先显示的文件夹
Folders first in paged results using CamlQuery and ListItemCollectionPosition
我正在使用 CamlQuery 和 ListItemCollection 实现分页,按名称字段对结果进行排序。我希望文件夹排在第一位,就像在 UI 中所做的那样,例如"folder A2, folder B2, file A1, file B1",但我得到 "file A1, folder A2, file B1, folder B2"。
完成这种排序和分页的最佳方法是什么?请注意,对于分页,我必须指定排序字段的值,这将是页面的第一条记录——我考虑过将两个排序字段添加到 CAML 中,但我不确定是否可以在 ListItemCollectionPosition.PagingInfo.
我目前使用的代码是这样的:
var queryText = @"
<View>
<Query>
<OrderBy Override='TRUE'>
<FieldRef Name='FileLeafRef' Ascending='True' />
</OrderBy>
</Query>
...
<RowLimit>
10
</RowLimit>
</View>";
var camlQuery = new CamlQuery();
camlQuery.ViewXml = queryText;
camlQuery.ListItemCollectionPosition = new ListItemCollectionPosition
{
PagingInfo = "Paged=TRUE&p_ID=1002&p_FileLeafRef=A1"
};
var items = list.GetItems(camlQuery);
要获得按 对象类型 排序的结果,您可以使用 FSObjType
属性,例如,以下 CAML 表达式告诉服务器 return首先是文件夹项目,然后是文件项目:
<OrderBy Override='TRUE'>
<FieldRef Name='FSObjType' Ascending='False' />
</OrderBy>
关于 ListItemCollectionPosition.PagingInfo
属性,以下表达式告诉 return 项目之后的项目,ID 通过 p_ID
参数指定并按对象类型排序:
var camlQuery = new CamlQuery();
camlQuery.ListItemCollectionPosition = new ListItemCollectionPosition
{
PagingInfo = "Paged=TRUE&p_FSObjType=1&p_ID=200"
};
例子
下例returns 200
项:
- ID 从
100
开始
- 并按对象类型排序(文件夹项目排在第一位)
代码:
var itemsCount = 200;
var startItemId = 100;
var queryText = @"
<View>
<Query>
<OrderBy Override='TRUE'>
<FieldRef Name='FSObjType' Ascending='False' />
</OrderBy>
</Query>
<RowLimit>
{0}
</RowLimit>
</View>";
var camlQuery = new CamlQuery
{
ViewXml = string.Format(queryText, itemsCount),
ListItemCollectionPosition = new ListItemCollectionPosition
{
PagingInfo = $"Paged=TRUE&p_FSObjType=1&p_ID={startItemId - 1}"
}
};
var items = list.GetItems(camlQuery);
ctx.Load(items);
ctx.ExecuteQuery();
更新
先按类型再按名称排序的项目PagingInfo
表达式示例:
Paged=TRUE&p_FSObjType=1&p_FileLeafRef=B2&p_ID=100
我正在使用 CamlQuery 和 ListItemCollection 实现分页,按名称字段对结果进行排序。我希望文件夹排在第一位,就像在 UI 中所做的那样,例如"folder A2, folder B2, file A1, file B1",但我得到 "file A1, folder A2, file B1, folder B2"。
完成这种排序和分页的最佳方法是什么?请注意,对于分页,我必须指定排序字段的值,这将是页面的第一条记录——我考虑过将两个排序字段添加到 CAML 中,但我不确定是否可以在 ListItemCollectionPosition.PagingInfo.
我目前使用的代码是这样的:
var queryText = @"
<View>
<Query>
<OrderBy Override='TRUE'>
<FieldRef Name='FileLeafRef' Ascending='True' />
</OrderBy>
</Query>
...
<RowLimit>
10
</RowLimit>
</View>";
var camlQuery = new CamlQuery();
camlQuery.ViewXml = queryText;
camlQuery.ListItemCollectionPosition = new ListItemCollectionPosition
{
PagingInfo = "Paged=TRUE&p_ID=1002&p_FileLeafRef=A1"
};
var items = list.GetItems(camlQuery);
要获得按 对象类型 排序的结果,您可以使用 FSObjType
属性,例如,以下 CAML 表达式告诉服务器 return首先是文件夹项目,然后是文件项目:
<OrderBy Override='TRUE'>
<FieldRef Name='FSObjType' Ascending='False' />
</OrderBy>
关于 ListItemCollectionPosition.PagingInfo
属性,以下表达式告诉 return 项目之后的项目,ID 通过 p_ID
参数指定并按对象类型排序:
var camlQuery = new CamlQuery();
camlQuery.ListItemCollectionPosition = new ListItemCollectionPosition
{
PagingInfo = "Paged=TRUE&p_FSObjType=1&p_ID=200"
};
例子
下例returns 200
项:
- ID 从
100
开始
- 并按对象类型排序(文件夹项目排在第一位)
代码:
var itemsCount = 200;
var startItemId = 100;
var queryText = @"
<View>
<Query>
<OrderBy Override='TRUE'>
<FieldRef Name='FSObjType' Ascending='False' />
</OrderBy>
</Query>
<RowLimit>
{0}
</RowLimit>
</View>";
var camlQuery = new CamlQuery
{
ViewXml = string.Format(queryText, itemsCount),
ListItemCollectionPosition = new ListItemCollectionPosition
{
PagingInfo = $"Paged=TRUE&p_FSObjType=1&p_ID={startItemId - 1}"
}
};
var items = list.GetItems(camlQuery);
ctx.Load(items);
ctx.ExecuteQuery();
更新
先按类型再按名称排序的项目PagingInfo
表达式示例:
Paged=TRUE&p_FSObjType=1&p_FileLeafRef=B2&p_ID=100