Linq gehört mittlerweile zu den Basics in der .NET Welt, im SharePoint-Umfeld kann sich Linq erst mit erscheinen von SharePoint 2010 einen Namen machen. Es gab bereits für SharePoint 2007 einige Community Projekte die den MOSS Linq-Fähig gemacht haben, aber OOB wird Linq erst mit der neuen Version des SharePoint´s unterstützt.
Warum nun doch Linq?
Es gibt einige gute Gründe die für die Verwendung von Linq im SharePoint Umfeld sprechen:
- CAML wird unnötig
- Strengtypisierte Abfragen
- Abfragesyntax wird zur Kompilierungszeit validiert
- Unterstützung durch den intelligenten IntelliSense bei der Entwicklung von Abfragen
- Listen werden als POCOS repräsentiert
- Analoge Verwendung wie bei Linq2Entities oder Linq2Sql
Hallo SPMetal, einen Proxy bitte!
Wie ich bereits vor einigen Tagen in einem Post beschrieben habe, kann man durch SPMetal die für Linq2SharePoint benötigten Proxies automatisch generieren lassen.
Der Syntax ist wie ihr nachlesen könnt denkbar einfach.
1: SPMetal /web:http://mySP2010Server/DeveloperSite /code:DeveloperSite.cs
Indem man den SPMetal aufruf als Pre-Build Ereignis einträgt, kann man sicherstellen dass die Proxies immer aktuell sind.
Das Herz von Linq2SharePoint der DataContext
Bei Linq2SharePoint ist der DataContext die Drehscheibe, jedes Query läuft (irgendwann) über den DataContext. Der DataContext für Linq2SharePoint ist an einer SPWeb Instanz.
Eine DataContext Instanz kann man einfach über den Konstruktor der Klasse definieren die wie bereits erwähnt als Parameter die SPWeb.URL erhält.
1: DataContext ctx =
2: new DataContext(SPContext.Current.Web.Url);
Nachdem der entsprechende DataContext erstellt wurde muss man lediglich die Listen aus dem Context laden um Abfragen dagegen ausführen zu können.
1: List<HyperLink> links = ctx.GetList("Lists/Links");
Sowohl der DataContext als auch die eigentliche Liste aus dem SharePoint werden automatisch von dem durch SPMetal generierten Proxy verwaltet… Dennoch sollte man wissen was hinter den Kulissen geschieht!!
Ein komplettes Query mit Linq2SharePoint seht ihr hier
1: DataContext ctx =
2: new DataContext(SPContext.Current.Web.Url);
3:
4: List<Task> tasks = ctx.GetList<Task>("Lists/DeveloperTasks");
5:
6: var importantTasks =
7: from t in tasks
8: where t.Priority = 'High'
9: select t;
10:
11: foreach(var task in importantTasks)
12: {
13: Console.WriteLine(task.ToString());
14: }
Endlich Relational
Ebenfalls neu in SharePoint 2010 ist die Möglichkeit Daten relational abzubilden. Die wird in SharePoint 2010 über Lookup Fields erreicht. Natürlich sind die in SharePoint 2010 erstellten Relationen dann auch in Linq2SharePoint Queries voll unterstützt und die Abbildung von komplexen Geschäftsprozessen mit verknüpften Daten ist nun auch endlich in SharePoint möglich.
Zum Thema Relationale Daten in SharePoint 2010 werde ich demnächst noch etwas genauer schreiben. Hier ist aktuell nur interessant dass es funktioniert.
Ein dementsprechendes Linq2SharePoint Query unterscheidet sich nicht von anderen Linq Queries gegen eine relationale Datenquelle.
Hier ein kurzes Beispiel, welches alle Produkte eines Lieferanten aus SharePoint 2010 lädt
1: var products =
2: from p in allProducts
3: where p.Supplier.ID ="4711"
4: select p;
Fazit
Dank Linq2SharePoint werden Abfragen gegen SharePoint nun endlich lesbarer und wartbarer als sie es noch in SharePoint 2007 dank CAML waren. Zwar gewöhnt man sich an alles aber es geht doch bedeutend einfacher! Oder?