SharePoint für Entwickler (Teil 4)
Kommentare

Nun muss freilich noch diese Seite als Basisseite eingetragen werden, was wiederum über das Inherits-Attribut geschieht. Statt LayoutsPageBase steht nun MyPageBase drin. Auf der Seite selbst besteht nun

Nun muss freilich noch diese Seite als Basisseite eingetragen werden, was wiederum über das Inherits-Attribut geschieht. Statt LayoutsPageBase steht nun MyPageBase drin. Auf der Seite selbst besteht nun Zugriff auf das gesamte SharePoint-API. Als ein typisches Beispiel soll hier gezeigt werden, wie eine Liste ausgelesen, nach bestimmten Bedingungen durchsucht und dann an ein Grid oder Repeater gebunden wird. Listing 2 zeigt, wie das in einer ASPX-Seite aussieht.


  
    
# Code Behind (Ausschnitt) private const int TAKEELEMENTS = 5; protected override void OnPreRender(EventArgs e) { if (!IsPostBack) { SPList questions = Web.Lists["Questions"]; var resultTop = from q in questions.Cast() where !(bool)q["Hidden"] orderby q.Title descending select q; rptTopAnswers.DataSource = resultTop.Take(TakeElements); rptTopAnswers.DataBind(); } base.OnPreRender(e); }

Der Link führt zu einer weiteren Seite, die Details aus einer SharePoint-Liste anzeigt. Spannender ist der Code in der Seite, der darunter gezeigt wird. Eine LINQ-Abfrage selektiert hier die Elemente. Aber Achtung! So elegant das aussieht, es hat seine Tücken. Hier kommt LINQ-to-Object zum Einsatz. Dazu müssen die Objekte aber erst mal da sein. Die Anweisung liest also die gesamte (!) Liste in den Speicher und führt dann die Filterung durch. Der Abruf erfolgt als abfragbares Objekt mittels Cast. Steigt die Anzahl der Elemente drastisch an, ist eine CAML-Abfrage unumgänglich. Hier können Sie auch zweistufig vorgehen, erst eine grobe Einschränkung mit CAML und dann eine feine Filterung auf den Elementen mittels LINQ.

LINQ-to-SharePoint wurde als die große Erweiterung in SharePoint 2010 gepriesen. Mittels eines Kommandozeilenwerkzeugs namens SpMetal [3] werden aus bestehenden Listen Wrapperklassen gebaut, die dann über den üblichen Datenkontext eine typisierte Sicht bereitstellen. Abgesehen von den üblichen Unwägbarkeiten sind die Ergebnisse brauchbar, wenngleich nicht sonderlich beeindruckend. Immerhin übersetzt LINQ-to-SharePoint intern in CAML, was bei größeren Datenmengen effizienter ist. Allerdings – was CAML nicht kann, steht dann auch LINQ nicht zur Verfügung. Damit dreht man sich im Kreis. CAML nutzen und LINQ wie gezeigt draufsetzen, hat sich in der Praxis als effektiver erwiesen. In Listing 3 wird das Prinzip angedeutet. Die Variable suchText enthält eine Zeichenkette, nach der in allen Titelfeldern gesucht wird.

# innerhalb des Postback-Zweiges
SPList questions = web.Lists["Questions"];
SPQuery query = new SPQuery();
query.Query = new XElement("Where",
                new XElement("Contains",
                    new XElement("FieldRef",
                        new XAttribute("Name", "Title")),
                    new XElement("Value", 
                        new XAttribute("Type", "Text"),
                        suchText)
                )
            ).ToString(SaveOptions.DisableFormatting);
var resultTop = from q in questions.GetItems(query).Cast()
                orderby q.Title descending
                select q;
rptTopAnswers.DataSource = resultTop.Take(TakeElements);
rptTopAnswers.DataBind();  

Damit kommt man schon ein gutes Stück weiter. Bleibt als Letztes die Frage, wie die Seiten der Anwendung in die Applikation eingebunden werden.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -