Ein Assembly, das es schon seit einigen Jahren gibt und das mir bei einem meiner letzten Projekte sehr geholfen hat, ist Camlex.Net.
Dabei handelt es sich, um die Möglichkeit SPQuery Abfragen auf Basis von “Expression Trees” zu erstellen. Somit ist es nicht notwendig CAML Abfragen manuell zu erstellen. Wie fehleranfällig bzw. wie unflexibel die dynamische Erweiterung von solchen Abfragen ist, weiß jeder, der es einmal versucht hat. Die Fehlermeldungen, die man im Fehlerfall erhält, wenn Abfragen falsch sind, geben auch selten Informationen über das tatsächliche Problem.
Um Camlex.Net verwenden zu können, braucht man lediglich die Camlex.Net.dll (oder für den Client-Zugriff die Camlex.Client.dll). Diese kann man auf Codeplex (http://camlex.codeplex.com/) herunterladen oder per Install-Package installieren. Wichtig dabei ist, wenn man es in einer SharePoint Lösung verwendet, muss diese DLL im Package inkludiert werden, falls sie nicht am Ziel SharePoint vorhanden ist. Zusätzlich muss man noch ein using System.Linq im Source Code hinzufügen und schon kann man mit Hilfe von LINQ komfortable Abfragen erstellen.
Eine einfache Abfrage
Stellen wir uns vor, wir suchen in einer Liste, die Büchertitel speichert, ein bestimmtes Buch mit dem Titel “Intrigen der Macht”. Diese Abfrage sieht mit Camlex.Net wie folgt aus.
var camlQuery = Camlex.Query()
.Where(item => (string)item[„Title“] == „Intrigen der Macht“);
Man erhält dadurch eine Instanz vom Type IQuery zurück, die eine Methode implementiert, um daraus ein SPQuery Objekt zu erzeugen.
camlQuery.ToSPQuery() liefert ein SPQuery Objekt zurück, das anschließend an die Methode SPLiist.GetItems(SPQuery) wie gewohnt übergeben werden kann.
Dieses einfache Beispiel zeigt, die Abfrage für konstante Werte.
Eine Abfrage mit dynamischen Werten
Nehmen wir aber an, man will einen dynamischen nicht konstanten Ausdruck, der über ein entsprechendes Interface übergeben wurde, abfragen. Das nachfolgende Beispiel ist die Umsetzung einer TextBox (TitleTextBox) in einer ApplicationPage und einem entsprechenden Code-Behind File.
Func<object> booktitle = () => TitleTextBox.Text;
var camlQuery = Camlex.Query()
.Where(item => (string)item[„Title“] == booktitle());
Dieses Beispiel entspricht nun schon eher einem echten Anwendungsfall, gehen wir aber noch einen Schritt weiter.
Eine dynamische Abfrage
Wenn man z.B. ein Suchformular hat, das es ermöglicht nach dem Titel und nach dem Autor zu suchen, wobei der Autor als optionaler Suchparameter mitgegeben werden kann, so muss man eine dynamische Abfrage erstellen. Dies würde dann mit Hilfe von Camlex.Net wie folgt umgesetzt werden:
Func<object> booktitle = () => TitleTextBox.Text;
Func<object> bookautor = () => AuthorTextBox.Text;
var expressions = new List<Expression<Func<SPListItem, bool>>>();
expressions.Add(item => (string)item[„Title“] == booktitle());
if (!string.IsNullOrEmpty(AuthorTextBox.Text))
expressions.Add(x => (string)item[„Author“] == bookauthor());
var camlQuery = Camlex.Query()
.WhereAll(expressions);
(Die Methode für OR wäre im obigen Beispiel .WhereAny(expressions).)
Somit hat man eine dynamische SPQuery, die nur den Autor in der Filterbedingung berücksichtigt, wenn dieser tatsächlich auch über das Suchformular eingegeben wird.
An dieser Stelle sei auch erwähnt, dass die Abfrage von verschiedenen Typen (Lookup, Int, DateTime, usw.), die Kombination von And und Or Operatoren, die Sortierung und die Gruppierung möglich sind.
Dem interessierten Leser empfehle ich folgende Links:
http://camlex.codeplex.com/ hier im Speziellen die Dokumentation und das Diskussionsforum.
Source: New feed