webForumDet fria alternativet

Optimering Lista

.NETur .NET

7 svar · 949 visningar · startad av martinpartin

Medlem sedan jan. 2001373 inlägg
Frågan#1

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;
        }
Medlem sedan aug. 20003 575 inlägg
#2

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.

Medlem sedan jan. 2001373 inlägg
#3

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

Medlem sedan aug. 20003 575 inlägg
#4

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

Medlem sedan juli 2003555 inlägg
#5

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?)

Medlem sedan jan. 2001373 inlägg
#6

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

Medlem sedan jan. 2001373 inlägg
#7

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!

Medlem sedan nov. 20014 054 inlägg
#8

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. :)

138 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)