SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




wie kann man die Abfrage von Berechtigung beschleunigen

Unbeantwortet Dieser Beitrag hat 7 Antworten

Ohne Rang
115 Beiträge
A C erstellt 30 Mai 2013 15:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Zusammen,

ich habe gerade ein Problem mit der Abfrage von Berechtigungen aus einem WebPart heraus.

Der WebPart bezieht sich in diesem Abschnitt auf Elemente aus einer Liste und es sollen nur die Elemente angezeigt werden, auf welche der Nutzer Schreibrechte hat.

Die Abfrage funktioniert, da ich aber durch die gesamte Liste mit FOREACH gehen muss und jedes Element auf Berechtigung prüfe, ist dies nun im Laufe der Zeit sehr langsam geworden.

Das Laden dauert ca 20 -30 sek bei 150-200 Elementen.

Gibt es Alternative? Kann man mit SPQuery Elemente abfragen, auf welche der Nutzer Schreibberechtigung hat?

Hat jemand eine Idee?

 

 

 

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 2 Juni 2013 15:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="A C"]Das Laden dauert ca 20 -30 sek bei 150-200 Elementen[/quote]

Das erscheint mir doch sehr langsam. Wie prüfst Du denn die Berechtigungen? Und wie sieht die foreach-Schleife aus? Bist Du sicher, daß die nicht "falsch" ist und vielleicht dauernd die Elemente neu lädt? Natürlich kann es aber auch einfach an schlapper Hardware liegen...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
115 Beiträge
A C Als Antwort am 5 Juni 2013 10:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Leider muss ich mit der Foreach Schleife alle Element abfragen und die Berechtigungen prüfen, da meiner Meinung nach keine Abfrage über Query oder Filter (Ansichten) in dem Fall möglich sind. da alle Lesendeberechtigung haben aber nur die Elemente mit SChreibberechtigung einbezogen werden sollen.

Ich fragen demnach die Rollenzuordnung des Items ab.

Ich habe eine Änderung beantragt, in dem wir uns über eine weitere Spalte die Berechtigungskennzeichnung markieren und dann per Query oder View abfragen können.

Sehr schade, dass solche Abfragen nicht per Standard unterstützt werden, oder ?

Aus der Ferne betrachtet, sieht alles ganz anders aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 5 Juni 2013 10:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nein, direkt abfragen kann man das nicht. Trotzdem wäre interessant zu wissen, wie Du die foreach-Schleife umgesetzt hast, weil man dabei viele Performancefehler machen kann. Bei der geringen Anzahl an Elementen sollte das jedenfalls deutlich schneller gehen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
115 Beiträge
A C Als Antwort am 5 Juni 2013 13:58
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

also die Berechtigung frage ich wie folgt ab:

SPBasePermissions basePerm = splistitem.GetUserEffectivePermissions(currentUser.LoginName);
if ((basePerm.ToString().Contains("EditListItems")) || (basePerm.ToString().Contains("FullMask")))
{
return true;
}
else
{
return = false;
}

Aus der Ferne betrachtet, sieht alles ganz anders aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 5 Juni 2013 15:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

splistitem.DoesUserHavePermissions(SPBasePermissions.EditListItems) wäre evtl. schneller. Mich hätte die Schleife selbst aber trotzdem mehr interessiert...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
115 Beiträge
A C Als Antwort am 5 Juni 2013 15:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok ist eine Alternative, werd ich auch mal testen und für die Zukunft verwenden.

Aber die Schleife ich eine normale ForEach Schleife

SPListItemCollection itemCollection = new SPListItemCollection();

foreach (SPlistItem item in currentList.Items)

{

if(HasEditPermission)

{

itemCollection.Add(item)

}

}

 

Aus der Ferne betrachtet, sieht alles ganz anders aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 5 Juni 2013 16:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="A C"]foreach (SPlistItem item in currentList.Items)[/quote]

Da haben wir's doch schon ;-)

Bitte niemals SPList.Items in Schleifen verwenden, weil es wirklich bei jedem Aufruf alle Elemente aus der Datenbank holt. Also immer nur so:
SPListItemCollection items = currentList.Items;
foreach (SPListItem item in items) {

}

Viele Grüße
Andi
af @ evocom de
Blog