0

TryGetList实际上是检索整个列表还是像IQueryable一样工作?如果我的列表有 100 万条记录,那么以下方法对吗?

  var list = web.Lists.TryGetList(<LIST NAME>);


  SPListItem item = list .Items.Cast<SPListItem>().FirstOrDefault(x => x["Id"] != null && x["Id"].ToString() == id && x["Status"] != null && x["Status"].ToString().ToLower() == "active");
4

2 回答 2

1

TryGetList 将返回 SPList 对象。如果该列表存在于对应的web中,则返回SPList,否则返回null。

您可以使用 ID 直接获取 ListItem。在这里你不想使用 Linq 过滤器。同样,您可以使用 Caml 查询。

按 ID 获取列表项:

SPList list = web.Lists.TryGetList(<LIST NAME>);
SPListItem item = list.GetItemById(id);

通过 Caml 查询获取列表项:

  SPList list = web.Lists.TryGetList(<LIST NAME>);
  SPListItemCollection itemsCol=list.GetItems(new SPQuery(){Query= "<Where><And><Eq><FieldRef Name='ID'/><Value Type='Counter'>"+id+"</Value></Eq><Eq><FieldRef Name='Status'/><Value Type='Text'>Active</Value></Eq></And></Where>"});
  if(itemsCol!=null && itemsCol.count>0)
  {
    SPListItem item =itemsCol.FirstOrDefault();
  }

在这里您可以下载 Caml Builder。

于 2018-08-06T14:47:43.483 回答
0

SPList返回的对象TryGetList是一个对象,该对象已经包含该列表周围的所有元数据,但它没有列表中项目的任何数据。例如,您可以确定列表的名称,或者从SPList对象创建列表的时间,而无需执行查询整个列表项集的所有工作。

当您访问 上的Items属性SPList并对其进行迭代时(正如您正在使用的那样First),您获得列表中的所有项目。该Items属性不是IQueryable<T>,您在其上使用的任何 LINQ 操作都将作用于拉入内存的整个集合。你显然不想仅仅通过它的 ID 来获取一个项目。要仅获取那一项,请使用GetItemByID.

于 2018-08-06T14:55:04.140 回答