2013-02-15 45 views
0

我想查询使用CAML(第一次做这个)列表项,并根据修改的日期,所以我可以接触到最新的文件对项目进行排序。但是,当试图根据ID获取SPListItem时,我失败了。获取基于指标项目从SharePoint CAML查询到SPListItemCollection

代码:

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:值没有在预期的范围内。

+0

是否检查集合确实包含的项目? 如果得到像命令错误“值没有在预期范围内”'COL [0]'它通常意味着空数组。 – banana 2013-02-17 10:47:14

回答

0

如果你想使用SPListItemId那么你并不需要去CAML,试试这个,

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

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

但如果你坚持使用CAML得到它,请确保您有Id在您的ViewFields caml查询。

而且使用Id为获得项目:

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

另外需要注意,ID属性的值是不一样的项目列表项集合中的索引。该属性包含该项目的基于1的整数ID,该ID大于之前添加的项目的ID。如果该项目被删除,其ID不会被重新使用。 [MoreInfo]

0

的问题是与我回来集合。我必须确保在使用该项目之前有结果:

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

愚蠢的错误。