выполните итерации списка sharepoint

Если вы хотите изменить поле на 'hello', только если оно 'bye', используйте это:

UPDATE table1
SET col1 = 'hello'
WHERE col1 = 'bye'

Если вы хотите обновить только если оно отличается от 'hello', используйте :

UPDATE table1
SET col1 = 'hello'
WHERE col1 <> 'hello'

Есть ли причина для такого странного подхода? Как прокомментировал Даниэль, особого усиления нет - разве что, если у вас есть тысячи строк с col1='hello'. Это тот случай?

6
задан raklos 8 June 2009 в 16:13
поделиться

7 ответов

Вы также можете перебирать элементы напрямую, и если вы используете поле URL, вы, вероятно, захотите использовать класс SPFieldUrlValue , поэтому вам не придется иметь дело с тем, как SharePoint хранит URL-адреса:

foreach(SPListItem item in spList.Items){
  SPFieldUrlValue data = item["Url"] as SPFieldUrlValue;
  // now you have data.Description, data.Url
}

Существует много таких SPField * вспомогательных классов, и они очень полезны, особенно когда у вас есть несколько значений.


Изменить:

По какой-то причине некоторые люди считают, что этот способ медленнее, основываясь на доказательствах в сообщении в блоге о сообщении Грега (даже проголосовали за него). Это, однако, не имеет ничего общего с моим ответом: цикл foreach создает Iterator, поэтому он не должен обращаться к базе данных еще 99 раз (в сообщении они использовали для цикл для доступа к первым 100 элементам).

1
ответ дан 17 December 2019 в 20:34
поделиться

если вы находитесь в функции, функция активируется в определенной области (например, сайт, Интернет, веб-приложение или ферма).

Если вы хотите получить доступ к списку из функции, используйте класс SPFeatureReceiver для привязки приемника событий к вашей функции. Затем в этом классе есть переопределения, когда запускается событие активации функции. это переопределение получает параметр типа SPFeatureReceiverProperties.

из этого параметра вы можете использовать переход на сайт:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
  using(SPSite site = properties.Feature.Parent as SPSite) //this depends on scope of feature
  {
    SPList myList = site.RootWeb.Lists["MyList"];
  }
}

, чтобы узнать, как выполнять итерацию этого списка, см. другие ответы

0
ответ дан 17 December 2019 в 20:34
поделиться

Из этого сообщения в блоге :

Правильный способ сделать это - сохранить возвращаемое значение свойства Items в переменной SPListItemCollection. При этом к базе данных запрашивается только один раз, а затем мы перебираем набор результатов, который хранится в объекте коллекции. Вот измененный пример кода:

SPListItemCollection items = SPContext.Current.List.Items;
for(int i=0;i<100 && i<items.Count;i++) {
  SPListItem listItem = items[i];
  htmlWriter.Write(listItem["Title"]);
}
2
ответ дан 17 December 2019 в 20:34
поделиться

Если вы работаете в среде x86, я недавно обнаружил потрясающий способ доступа к данным только для чтения с помощью MSSQL / OLEDB ...

SELECT * FROM OPENROWSET (
    'Microsoft.ACE.OLEDB.12.0',
    'WSS;IMEX=1;RetrieveIds=Yes;DATABASE=http://sharepoint.lsi.local/ops/;LIST={3DCAF100-44A1-4331-8328-748AA98E36AB};',
    'SELECT * FROM list'
)

http: // www.connectionstrings.com/sharepoint

-1
ответ дан 17 December 2019 в 20:34
поделиться

Как говорили другие, вам не следует выполнять итерацию коллекции Items напрямую (особенно в больших коллекциях). Альтернативный вариант:

// если вам нужна вся коллекция. В противном случае используйте SPQuery из списка

DataTable dt = list.Items.GetDataTable();

foreach (DataRow row in dt.Rows)
{
 ...

. Тогда вы сможете делать множество вещей. Если вам нужно выполнить проверку, чтобы получить только некоторые из элементов, например:

   if (row["ContentType"].ToString().Equals("Your contenttype id"))
   {
   SPListItem item = list.GetItemById((int)row["ID"]);

, или используйте SpQuery для получения столбца в запросе, например:

SPQuery oQuery = new SPQuery();
oQuery.ViewFields = "<FieldRef Name='UrlColumn'/>";

list.Items.GetItems(oQuery).GetDataTable();

...foreach code...
row["UrlColumn"] 
-1
ответ дан 17 December 2019 в 20:34
поделиться

BTW При использовании OPENROWSET ...

IMEX = 2 для чтения / записи. IMEX = 1 - только для чтения.

List = [Name] у меня работает вместо того, чтобы использовать list = {GUID}.

-1
ответ дан 17 December 2019 в 20:34
поделиться

Для извлечения всех элементов списка и итераций по каждому из них, лучшим решением будет следующее (предполагая, что этот код выполняется как часть функции):

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    using(SPSite site = properties.Feature.Parent as SPSite)
    {
        SPList list = site.RootWeb.Lists["ListName"];
        SPListItemCollection items = list.Items;

        foreach (SPListItem listItem in items)
        {
            Response.Write(SPEncode.HtmlEncode(listItem["Url"].ToString()) +"<BR>");
        }
    }
}

Но если список очень большой, то лучше пролистать по элементам списка:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    using(SPSite site = properties.Feature.Parent as SPSite)
    {
        SPList list = site.RootWeb.Lists["ListName"];

        if(items.ItemCount > 100)
        {        
            SPQuery query = new SPQuery();
            query.RowLimit = 100;
            int index = 1;

            do
            {
                SPListItemCollection items = list.GetItems(query);

                foreach (SPListItem listItem in items)
                {
                    Response.Write(SPEncode.HtmlEncode(listItem["Url"].ToString()) +"<BR>");
                }

                query.ListItemCollectionPosition = items.ListItemCollectionPosition;
                index++;

            } while (query.ListItemCollectionPosition != null);
        }
        else
        {
            SPListItemCollection items = list.Items;

            foreach (SPListItem listItem in items)
            {
                Response.Write(SPEncode.HtmlEncode(listItem["Url"].ToString()) +"<BR>");
            }
        }
    }
}

Это основано на Best Practices for SharePoint от Microsoft.

3
ответ дан 17 December 2019 в 20:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: