Hmm ... Lassen Sie mich vorweg sagen, dass dieser Artikel keine große praktische Bedeutung hat. Studenten, die wissen möchten, wie man etwas verwendet, können also Alt + F4 (oder Strg + W) drücken. Studierende, die wissen möchten, wie SharePoint funktioniert, können weiter nach unten scrollen.
Ich schreibe gerade ein Buch über die SharePoint 2010-Entwicklung mit KB und habe diese Methode zufällig entdeckt, als ich 2010 das neu hinzugefügte Objektmodell untersuchte. Wir alle wissen, dass 2003/2007 die GetItemById-Methode von SPList verwendet wurde, um Listenelemente basierend auf der ID abzurufen (Was, haben Sie noch nie von dieser Methode gehört? Dann sind Sie leider kein qualifizierter SharePoint-Entwickler ...). Der Name dieser neu hinzugefügten Methode lautet GetItemByIdSelectedFields (zur Ergänzung wird auch eine GetItemByIdAllFields-Methode hinzugefügt, die jedoch völlig äquivalent zu GetItemById ist, also kein Unsinn mehr).
1: öffentliches SPListItem GetItemByIdSelectedFields(int id, params string[] Felder)
Als ich das zum ersten Mal sah, dachte ich sofort an die ViewFields-Eigenschaft von SPQuery. Beim Abrufen eines Listeneintrags werden zur Verbesserung der Effizienz nur bestimmte angegebene Felder zurückgegeben. Aber als ich ein Konsolenprogramm zum Testen schrieb, stellte ich fest, dass es nicht das war, was ich mir vorgestellt hatte. Ich habe zum Beispiel geschrieben (diese Methode erfordert das Schreiben des internen Namens):
1: SPListItem item = spList.GetItemByIdSelectedFields(1, "Title", "Created"); 2: Console.WriteLine(item["Modified"]);
Dieses Programm hat tatsächlich keinen Fehler gemeldet und der geänderte Wert wurde normal zurückgegeben, also habe ich es versucht. Es gab tatsächlich 50 Felder in einer benutzerdefinierten Liste, deren Werte normal zurückgegeben wurden, aber alle Abfrageelemente, Benutzer und Benutzergruppen Wird normal zurückgegeben. (Tatsächlich handelt es sich hierbei im Wesentlichen um ein Suchelement.) Es wurden keine zurückgegeben.
Aus Neugier (es kann mich noch nicht umbringen) habe ich mir den Quellcode dieser Methode angesehen:
1: if(field == null) 2: { 3: throw new ArgumentNullException("fields"); 4: } 5: 6: StringBuilder builder = new StringBuilder(); 8: { 9: if (str != null) 10: { 11: builder.Append("<FieldRef Name="" + str + ""/>" 12: } 13: } 14: 15: foreach (SPField Feld in this.Fields) 16: { 17: bool flag = false; 18: foreach (string str2 in columns) 19: { 20: if (str2 == field.InternalName) 21: { 22: flag = true; break; 24: } 25: } 26: if (!flag && field.MustFetchByDefault) 27: { 28: builder.Append("<FieldRef Name=""); 29: builder.Append(field.InternalName); 30 : builder.Append(""/>"); 31: } 32: } 33: 34: return this.GetItemById(id, null, false, builder.ToString());
Was die letzte GetItemById betrifft, müssen Sie sich zunächst nicht damit befassen, dass es sich um eine Überladung von GetItemById handelt und ihr Zweck darin besteht, Elemente zu finden, die abgerufen werden müssen . .
Das Foreach in Zeile 7 ist leicht zu verstehen. Das Foreach in Zeile 15 ist am Anfang etwas verwirrend. Müssen wir auch andere Felder hinzufügen? Und was ist MustFetchByDefault von SPField? Lassen Sie uns etwas tiefer graben und einen Blick darauf werfen:
1: internal bool MustFetchByDefault 2: { 3: get 4: { 5: string fieldAttributeValue = this.GetFieldAttributeValue("List"); 6: if(!string.IsNullOrEmpty(fieldAttributeValue) && 7: (fieldAttrbuteValue != GlobalList.Docs. ToString())) 8: { 9: return false 10: } 11: return true 12: } 13: }
Wie kann festgestellt werden, ob ein Feld abgerufen werden muss? Durch die Beurteilung eines Listenattributs des Felds wird die GetFieldAttributeValue-Methode nicht mehr gepostet (andernfalls besteht der Verdacht, dass die Wortanzahl betrogen wird). Kurz gesagt, es wird eine Liste aus dem XML-Knoten gefunden, die dem SchemaXml-Attribut (Feldbeschreibung) ähnelt ) der Feldeigenschaften. Wenn es gefunden wird und es sich nicht um GlobalList.Docs handelt (etwas Besonderes), ist dieses Feld nicht erforderlich. Mit anderen Worten, ich muss dieses Feld nicht an den Benutzer zurückgeben.
Welche Felder haben also List-Attribute in SchemaXml? Ein Feld mit einer Liste von Attributen? Schauen Sie sich den Artikel an! Ha, es hat wirklich alle Suchbegriffe vermieden. (Docs ist das Listenattribut des Felds „Pfad“, das möglicherweise einen besonderen Ursprung hat.)
Jetzt wissen wir, warum alle anderen Felder enthalten sind und die Suche nicht. Aber warum? Wenn wir etwas über die SharePoint-Inhaltsdatenbank wissen, wissen wir, dass das Abfrageelement tatsächlich nur einen ID-Wert in der AllUserData-Tabelle in der Inhaltsdatenbank speichert (aber wenn es mithilfe des Objektmodells herausgenommen wird, enthält es das entsprechende Feld des Inhalt des Abfrageelements), was bedeutet, dass Sie, wenn Sie den Wert des Abfrageelements zurückgeben möchten, einige zusätzliche Datenbankoperationen durchführen müssen (z. B. das Abfrageelement finden, den Wert des entsprechenden Felds zurückgeben und es zusammenfügen). "1 ;#Administrator" diese Art von Geisterblick). Noch wichtiger: Wenn das Nachschlageelement mehrwertig ist, wird das Nachschlageelement selbst in einer anderen Tabelle (AllUserDataJunctions) gespeichert, sodass die Rückgabe sehr aufwändig ist. Im Jahr 2010 wurde also etwas Neues hinzugefügt. Wenn unsere Liste viele Suchelemente enthält und wir vorerst möglicherweise nur ein oder zwei davon (oder gar keines) verwenden, scheint es, dass die Verwendung dieser Methode tatsächlich eine Menge verbessern kann . Effizienz.