0

我正在尝试使用 caml 查询列表项目(第一次这样做)并根据修改日期对项目进行排序,以便我可以访问最新的文档。但是,当尝试根据 ID 获取 SPListItem 时,我失败了。

代码:

SPQuery query = new SPQuery();
String camlquery = "<OrderBy><FieldRef Name='Modified' Ascending='False' /></OrderBy>";                        
query.ViewAttributes = "Scope = 'Recursive'";
query.ViewFields = "<FieldRef Name='Modified' /><FieldRef Name='Title' /><FieldRef Name='Name' />";
query.Query = camlquery;
query.IncludeMandatoryColumns = true;
SPListItemCollection col = list.GetItems(query);


//failing here... I think   
SPListItem item = col.GetItemById(0);

有没有办法根据 SPListItemCollection 中的索引获取 SPListItem?

我努力了

SPListItem item = col[0];

也没有运气。

这是我得到的错误:

值不在预期范围内。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:值不在预期范围内。

4

2 回答 2

0

如果你想SPListItem使用,Id那么你不需要去 caml,试试这个,

 SPSite oSite = new SPSite("http:/MyTestSite/");
 SPWeb oWeb = oSite.OpenWeb();
 SPList oList = oWeb.Lists["MyCustomList"];

 SPListItem oListItem = oList.Items.GetItemById(1);

但是如果您坚持使用 caml 来获取它,请确保您包含Id在您的ViewFieldscaml 查询中。

并使用Idas 获取项目:

foreach (ListItem item in col)
{
    if(item["Id"] == 1) //Only an example
    {
        var itemFromId = item;
    }
}

还要注意,ID 属性的值与列表项集合中项的索引不同。此属性包含项目的从 1 开始的整数 ID,它比之前添加的项目的 ID 大一。如果项目被删除,它的 ID 不会被重用。[更多信息]

于 2013-02-15T22:10:53.453 回答
0

问题在于我要退回的收藏品。在使用该项目之前,我必须确保有结果:

if (col.Count > 0)
{
SPListItem item = col[0];
}

愚蠢的错误。

于 2013-02-27T19:15:10.387 回答