перебрать список sharepoint - PullRequest
6 голосов
/ 08 июня 2009

В коде, как я могу получить доступ к списку, например, «MyList» в sharepoint, затем переберите элементы этого списка и получите значение определенного столбца в этом списке, например столбец «URL»?

Ответы [ 10 ]

3 голосов
/ 07 февраля 2010

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

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

Это основано на рекомендациях Microsoft для SharePoint .

.
2 голосов
/ 08 июня 2009

С этого блога :

Правильный способ сделать это - сохранить возвращаемое значение свойства 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"]);
}
1 голос
/ 08 июня 2009

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

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

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


Edit:

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

0 голосов
/ 30 августа 2018

Ниже приведен код, используемый для удаления всех элементов списка, и здесь можно пропустить последние 150 элементов для удаления. Итерация по SPListItemCollection и очень быстрое время, например 3000 элементов, будут удалены за 2 минуты.

SPList list = web.Lists["DemoDelete"];

SPListItemCollection collListItems = list.GetItems();
var watch = System.Diagnostics.Stopwatch.StartNew();
Console.WriteLine("Start Time: " + watch);
//delete all items uncomment this code
//foreach (SPListItem item in collListItems)
//{
//    SPListItem delItem = list.GetItemById(item.ID);
//    Console.WriteLine("Item Deleted" + delItem.ID);
//    delItem.Delete();
//    list.Update();
//}
//skip lastest 150 items
for (int i = collListItems.Count - 150; i >= 0; i--)
{
SPListItem listItem = list.GetItemById(collListItems[i].ID);  //collListItems[i];
Console.WriteLine("Item Deleted" + listItem.ID);
listItem.Delete();
list.Update();
}

watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
Console.WriteLine("End Time: " + elapsedMs);
0 голосов
/ 12 июня 2018

Ниже представлен лучший вариант итерации

    SPList list = web.Lists[listname];

    SPQuery query = new SPQuery();
    query.Query = "<OrderBy><FieldRef Name='ID' /></OrderBy>";
    //Scope="Recursive" retrieves items from all folders and subfolders in a list
    query.ViewFields = "<FieldRef Name='" + Lists.MRPLibrary.RebateClaimed + "' /><FieldRef Name='ID'/>";
    query.ViewAttributes = "Scope=\"RecursiveAll\"";
    query.RowLimit = 100;

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

        foreach (SPListItem listItem in items)
        {

        }

        query.ListItemCollectionPosition = items.ListItemCollectionPosition;

    } while (query.ListItemCollectionPosition != null);

}
0 голосов
/ 19 июля 2016

Я знаю, что этот вопрос задавали очень давно, но я надеюсь, что смогу помочь кому-то сейчас:)

Вот как мне это удалось,

protected void Page_Load(object sender, EventArgs e)
    {
        // Get the current domain 
        var current = HttpContext.Current.Request.Url.Host;

        // We need to tell the SPSite object the URL of where our List is stored.
        // Make sure you have the right location placed after the 'current' variable
        using (SPSite spSite = new SPSite("http://"+current+"/DirectoryForLists/Lists")) 
        {
            // Returns the Web site that is located at the specified server-relative or site-relative URL.
            using (SPWeb spWeb = spSite.OpenWeb())
            {
                //Get our list we created.
                SPList list = spWeb.Lists["Name Of the List"];

                // Create a new SPQuery object that will hold our CAML query.
                SPQuery q = new SPQuery();
                // CAML query.
                // This allows you to controll how you receieve your data.
                // Make the data ASC or DESC. Find more on MSDN.
                q.Query = "<OrderBy><FieldRef Name='DESCR' Ascending='TRUE' /></OrderBy>";

                // We put our list data into a SP list Item Collection.
                // Notice that the CAML query is the only parameter for the GetItems() function.
                SPListItemCollection items = list.GetItems(q);

                // Here you can loop through your list.
                foreach (SPListItem spItem in items)
                {
                    // Your code here.
                    MessageBox(spItem);

                    // Get URL column
                    MessageBox(spItem["URL"]);

                    // Another Column
                    MessageBox(spItem["DateTime"]);
                }
            }
        }
    }
0 голосов
/ 11 сентября 2009

КСТАТИ При использовании OPENROWSET ...

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

Список = [Имя] работает для меня вместо необходимости использовать список = {GUID}.

0 голосов
/ 11 июня 2009

Если вы находитесь в среде 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

0 голосов
/ 11 июня 2009

Как уже говорили другие, вы не должны выполнять итерацию коллекции 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"] 
0 голосов
/ 09 июня 2009

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

Если вы хотите получить доступ к списку из функции, используйте класс 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"];
  }
}

о том, как повторить этот список, смотрите другие ответы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...