вторник, 14 декабря 2010 г.

SharePoint: Creating big list with look up fields

Понадобилось мне тут проверить, как будет вести себя мой продукт с большими листами содержащими LookUp поля. Создавать руками это не наш метод, потому набросал код который в определенном сайте создает листы и лист с лукапами на них.

Вот такой запуск:
LookUpCreator http://server/site1 10 10 100

создаст 10 листов "ToList" с 10 итемами вида "Item " и лист "LookUpList" содержащий 10 лукапных колонок на вышеозначенные листы и содержащий 100 итемов.

Хочу отметить что первая лукапная колонка не содержит значении специально. И так же часть значении не заполнены. Этим я имитировал некоторые нужные мне ситуации.

        static void Main(string[] args)
        {
            Console.WriteLine("LookUps creator usage <site url> <to lists count> <to lists items> <lookup items count>");

            var siteUrl = args[0];

            var toCount          = int.Parse(args[1]); //   10;
            var toListItemsCount = int.Parse(args[2]); //   10;
            var lookUpItemsCount = int.Parse(args[3]); // 7000;

            var listToBaseName = "ToList";
            var lookUplistName = "LookUpList";

            using (var site = new SPSite(siteUrl))
            {
                using (var web = site.OpenWeb())
                {
                    Console.WriteLine("Creating to {0} lists with {1} items", toCount, toListItemsCount);
                    var toLists = new List<SPList>(toCount);
                    for (int iList=0; iList<toCount; iList++)
                    {
                        var toListName = listToBaseName + iList.ToString();
                        Console.WriteLine("Creating to list '{0}'", toListName);

                        var lstId = web.Lists.Add(toListName, "test to list",SPListTemplateType.GenericList);
                        var spList = web.Lists.GetList(lstId, true);

                        toLists.Add(spList);
                       
                        for (int iItem = 0; iItem < toListItemsCount; iItem++)
                        {
                            var item = spList.Items.Add();
                            item["Title"] = string.Format("List '{0}' item {1}",toListName,iItem );
                            item.Update();
                            Console.WriteLine("\tadd item {0}", iItem);
                        }
                    }

                    Console.WriteLine("Creating look up list {0}", lookUplistName);

                    var lookUplstId = web.Lists.Add(lookUplistName, "test lookup list", SPListTemplateType.GenericList);
                    var spLookUpList = web.Lists.GetList(lookUplstId, true);

                    for (int iField = 0; iField<toCount; iField++)
                    {
                        var fldName = "LookUpField"+iField.ToString();
                        var fldIntName = spLookUpList.Fields.AddLookup(fldName, toLists[iField].ID, false);
                        var fldLookUp = spLookUpList.Fields[fldIntName] as SPFieldLookup;                        
                        fldLookUp.ShowInDisplayForm = true;
                        fldLookUp.LookupField = "Title";
                        fldLookUp.Update();
                        Console.WriteLine("\tadd column '{0}'", fldIntName);
                    }

                    Console.WriteLine("Creating {0} look up items", lookUpItemsCount);

                    var Rnd = new Random();
                    for (int iItem = 0; iItem < lookUpItemsCount; iItem++)
                    {
                        var spItem = spLookUpList.Items.Add();

                        spItem["Title"] = "Item " + iItem.ToString();

                        for (int iField = 0; iField < toCount; iField++)
                        {
                            var fldName = "LookUpField" + iField.ToString();

                            if (iField == 0)
                                spItem[fldName] = null;
                            else
                            {
                                var rId = Rnd.Next(0, toListItemsCount);
                                if (rId == 0)
                                    spItem[fldName] = null;
                                else
                                    spItem[fldName] = rId;
                            }
                        }
                        spItem.Update();
                        Console.WriteLine("\t" + spItem.Title);
                    }

                    Console.WriteLine("Done!");
                }
            }
        }
 


Может быть, кому-нибудь пригодится или послужит примером. UPD: Вариант этого же кода, но на PowerShell тут

9 комментариев:

DkmS комментирует...

По идее, такие дела надо на PS делать... Я уже начал на нём моделировать всякие действия, а потом на C# переносить ;-)

DkmS комментирует...

Только доллар спереди писать задалбывает :-(

Advard II комментирует...

Согласен ,но я пока не могу себя заставить писать что либо на PS ,непривычный он уж больно.

DkmS комментирует...

Я вот заставляю - очень уж удобно обработчики на списки на нём делать. Там можно прямо как на шарпе делать, только вот доллары...

Advard II комментирует...

Попробую на досуге переписать. :)

Advard II комментирует...

Вот переписал на PowerShell (см. отдельный пост), писать везде $ достает ,но еще больше достают всякие -lt и -eq вместо человеческих знаков больше, меньше и равно. :)

DkmS комментирует...

Да, это тоже ;-) Главное, отладчика нет для Глесснеровских примочек

Advard II комментирует...

Сорри, а что такое "Глесснеровские примочки"? Просто в том же PowerGUI вполне себе рабочий отладчик.

DkmS комментирует...

На codeplex по слову iLoveSharepoint - эти самые примочки от C.Glessner.