---
title: "Optimering Lista"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/181522-optimering-lista"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "martinpartin"
published: "2009-12-04T14:06:04.000Z"
updated: "2010-01-01T16:46:29.000Z"
replies: 7
views: 964
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/181522-optimering-lista"
---

# Optimering Lista

## #1 — martinpartin, 2009-12-04T14:06Z

Hej,

Har byggt ett bokningsverktyg för sharepoint. Det var förövrigt ingen bra idé från början kan jag ju tillägga. Nu när det används ett tag så ju mer det är i det ju långsammare blir det. 

Jag undrar utan att analysera hur sharepoint jobbar mot databasen om man kan förenkla och optimera koden nedan. Vanliga programmerings missar helt enkelt. Låt mig veta om det är något som kan göras enklare och bättre !

```

private static List<Events> pGetEvents(string sQuery)
        {
            SPQuery query = new SPQuery();
            query.ViewFields = QueryFieldsEvents();

            query.Query = sQuery;
            SPWeb site = null;
            if (SPContext.Current != null)
            {
                site = SPContext.Current.Web;
            }
            else if (_site != null)
            {

                site = _site;
            }
            else
            {
                return null;
            }

            SPList list = site.Lists["BookARoomEvents"];
            SPListItemCollection items = list.GetItems(query);

            System.Collections.Generic.List<Events> olist = new System.Collections.Generic.List<Events>();

            int count = items.Count;

            for (int i = 0; i < count; i++)
            {
                SPListItem item = items[i];
            
                if ((bool)item["fRecurrence"])
                {
                    SPQuery query2 = new SPQuery();
                    query2.ExpandRecurrence = true;
                    query2.Query = "<Where><And><DateRangesOverlap><FieldRef Name=\"EventDate\" /><FieldRef Name=\"EndDate\" /><FieldRef Name=\"RecurrenceID\" /><Value Type=\"DateTime\"><Quarter /></Value></DateRangesOverlap><Eq><FieldRef Name='ID'/><Value Type='Text'>" + item.ID + "</Value></Eq></And></Where>";

                    DateTime cal = (DateTime)item["EventDate"];
                    query2.CalendarDate = cal;
                    
                    SPListItemCollection recurrenceItems = item.ParentList.GetItems(query2);

                    int recurItemsCount = recurrenceItems.Count;

                    for (int j = 0; j < recurItemsCount; j++)

                        {

                                        SPListItem recurItem = recurrenceItems[j];
                                        olist.Add(addEvent(recurItem));

                        }
                   

                }
                else
                {
                    olist.Add(addEvent(item));
                }
            }
            return olist;
        }
```

Permalänk: https://www.webforum.nu/p/181522

## #2 — Nickemannen, 2009-12-04T23:37Z

Jag vet inte exakt hur sharepoint fungerar men kan det vara så att den går mot databasen vid följande rad.
       SPListItemCollection recurrenceItems = item.ParentList.GetItems(query2);
I sådana fall så ställer den flera frågor mot databasen, (så många som           int count = items.Count;

            for (int i = 0; i \< count; i++)
            {
) och är det många så kan det påverka prestandan drastiskt.

Permalänk: https://www.webforum.nu/p/2216451

## #3 — martinpartin, 2009-12-07T09:04Z

Hej, 
Ja, Den delen är det som tar lång tid. Men kan tyvärr inte göra någonting åt det tror jag. Men jag tänkte om det fanns några generalla programmerings missar som kunde hjälpa något.

/M

Permalänk: https://www.webforum.nu/p/2216648

## #4 — Nickemannen, 2009-12-07T21:34Z

Om du använder join så ordnar det sig :).
Då slipper den så många anrop,

Permalänk: https://www.webforum.nu/p/2216753

## #5 — onkelborg, 2009-12-07T21:46Z

Tänker samma sak som Nickemannen när jag ser det där.. Du har ingen som helst anledning till att göra alla de där anropen, stoppa ihop det till en enda fråga istället.

Det som jag dock ser som kan ställa till problem är just det att din funktion tar emot en valfri fråga som parameter, men.. I vanlig SQL så kan man använda WHERE Id IN (1, 4, 7, 30, 2554) för att plocka alla rader där id matchar något av 1, 4, 7 osv. Finns det något liknande i Sharepoint? Det kanske skulle vara en acceptabel medelväg?

I så fall så blir det, psuedokod:

huvudlista = getitems(parameterFråga);
List\<int\> listaMedId = new List\<int\>();
foreach(sak in huvudlista)
{
  listaMedId.Add(sak.Id);
}
underlista = getitems("\<where\>blabla IN(" + listaMedId.Aggregate("", (x, y) =\> x + "," + y)) + "blabla\</where\>");

Det där är väldigt mycket snabbare kod, endast två anrop till getitems.

(Det optimala är dock att ha endast ett anrop, vid ännu större datamängder kan det kanske bli ett krav, och då måste du nog börja ge dig på att parsa den inkommande sql-frågan, som iofs. kanske inte är något större jobb iom att den ser ut att vara xml?)

Permalänk: https://www.webforum.nu/p/2216755

## #6 — martinpartin, 2009-12-08T18:30Z

Hej !

tack för tänket. jag det borde ju fungera att spara dem och fråga en fråga istället. Helt klart värt ett försök. Det är ju CAML så det blir lite jobbigt att bygga upp frågan bara. Men ska prova,återkommer !

Kommer ni på mer så är det bara att posta på.

/M

Permalänk: https://www.webforum.nu/p/2216854

## #7 — martinpartin, 2009-12-30T10:31Z

Hej, 

Har tyvärr inte fått detta att fungera . la 8 timmar på det. Så kommer att bygga om lösningen för att undivika detta. Tack för er hjälp i alla fall!

Permalänk: https://www.webforum.nu/p/2218544

## #8 — Fredde Mannen, 2010-01-01T16:46Z

Kan ju säga att sharepoint är en mardröm. Speciellt att programmera emot. :)

Det brukar bli ganska segt när antalet items växer i en lista.

Ibland kan det vara bättre att ha en separat databas med hederliga tabeller och sedan göra en webpart som nyttjar den databasen och dess tabeller. I alla fall så fort man börjar tala om listor som skall vara länkade etc. :)

Permalänk: https://www.webforum.nu/p/2218686

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/181522-optimering-lista
