Список Sharepoint извлекает большие данные С#

Действительно ли TryGetList извлекает весь список или он работает как IQueryable? Если в моем списке 1 миллион записей, правильный ли это подход?

  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");

person Navin    schedule 05.08.2018    source источник


Ответы (2)


TryGetList возвращает объект SPList. Если список существует в соответствующей сети, будет возвращен SPList, иначе будет возвращено значение null.

Вы можете напрямую получить ListItem, используя ID. Здесь вы не хотите использовать фильтр Linq. Точно так же вы можете использовать Caml Query.

Получить элемент списка по идентификатору:

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.

person Naveen Prasath    schedule 06.08.2018
comment
Большой. но просто добавим, что вам нужно внутреннее имя вместо идентификатора и статуса ...‹FieldRef Name='‹ID›'/› ... ‹FieldRef Name='‹Status›'/› - person Navin; 10.08.2018

Объект SPList, возвращаемый TryGetList, — это объект, у которого уже есть все метаданные, окружающие этот список, но нет никаких данных для элементов в списке. Вы можете, например, определить имя списка или, когда он был создан, из объекта SPList, ему не нужно будет выполнять всю работу по запросу всего набора элементов списка.

Когда вы получаете доступ к свойству Items в SPList и повторяете его (как вы делаете с First), вы, тем не менее, получаете все элементы в списке. Свойство Items не является IQueryable<T>, любые операции LINQ, которые вы используете для него, воздействуют на всю коллекцию, загруженную в память. Вы, очевидно, не хотите делать это только для того, чтобы получить элемент по его идентификатору. Чтобы получить только этот предмет, используйте GetItemByID.

person Servy    schedule 06.08.2018