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;
}
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.
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.
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?)
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 !
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. :)
140 ms totalt · 3 externa anrop · v20260731065814-full.9823c0c5