Blog » LINQ w SharePoint 2010

LINQ w SharePoint 2010

 
LINQ w SharePoint 2010
SharePoint 2010 jak można się na razie przekonać jest dużo bardziej dojrzałym produktem od poprzednich wersji. Wprowadzenie wielu nowych funkcji spowodowało, że ta platforma stała się bardziej potężna niż była do tej pory. Jedną z funkcji dostępnych już od .NET 3.0, a nie implementowanych do tej pory w SharePoint jest LINQ. Co to może nowego wnieść do sposobu pisania rozwiązań pod tę platformę, można się przekonać czytając ten post. Jest to pierwszy z dwóch postów opisujących tę technologię.

Tak jak zostało zapowiedziane we wstępie, ten post czyli pierwszy z dwóch dotyczyć będzie wykorzystania LINQ po stronie serwera. Dla przykładu zostanie stworzony WebPart w Visual Studio, który będzie wykorzystywał LINQ do przeprowadzania operacji na danych. 
Przed rozpoczęciem pracy należy stworzyć w SharePoint 2010 instancję listy z szablonu Contacts o nazwie "Employees", a następnie wprowadzić przykładowe dane. Całość powinna wyglądać następująco:
 

Mając przygotowane dane, należy w dalszej kolejność utworzyć projekt w Visual Studio z szablonu Visual Web Part.
 

Przed przystąpieniem do pisania zapytań w LINQ należy stworzyć klasę, która opisuję strukturę danych dostępną na portalu z listą Employees. Klasę tę można wygenerować stosując jedną z dwóch metod:
 
1. Wykorzystać narzędzie SPMetal.exe dostarczane łącznie z SharePoint 2010
Wspomniana aplikacja jest bardzo przydatnym narzędziem, które dostarcza podstawową funkcjonalność tworzenia modelu danych. Dużo większe możliwość (podobne do LINQ to Entity) dostarczają rozwiązania firm trzecich. Do plusów SPMetal należą między innymi:
- generuje model danych na podstawie strony SharePoint w dwóch językach C# i VB,
- daje możliwość konfiguracji za pomocą XML, które obiekty strony mają być zmapowane,
- jest prosty w obsłudze.
 
Aby ściągnąć całą strukturę danych z portalu SharePoint należy wywołać aplikację SPMetal z parametrami:
spmetal.exe /web:http://os-stg /code:C:\PortalSite.cs
Aplikacja SPMetal.exe znajduje się w katalogu: 
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN
 
Taki sposób ściągania struktury danych jest wygodny ale niestety tworzy klasę zawierającą wszystkie obiekty znajdujące się na stronie. Istnieje jednak możliwość konfiguracji SPMetal w ten sposób aby zbudować klasę obrazującą jedynie niektóre obiekty. Przykładowy XML dla listy Employees przedstawiany jest poniżej:
<Web AccessModifier="Internal" xmlns="http://schemas.microsoft.com/SharePoint/2009/spmetal">
<List Name="Employees">
    <ContentType Name="Contact" Class="ContactUser" />
</List>
<ExcludeOtherLists></ExcludeOtherLists>
</Web>
 
Dla prostoty użycia narzędzia SPMetal można stworzyć plik *.bat który będzie uruchamiał aplikację z odpowiednimi parametrami. Zawartość takiego pliku dla aktualnego przykładu wygląda następująco:
@SET SPMETAL="C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN\SPMetal.exe"
%SPMETAL% /web:http://os-stg /code:EmployeesList.cs /language:csharp /parameters:SPMetal.xml
pause
gdzie:
SPMetal.xml to jest plik z konfiguracją przedstawioną powyżej.
2. Wykorzystać narzędzia DSL firm trzecich
Aby uprościć jeszcze bardziej proces tworzenia modelu danych można użyć dodatków do Visual Studio firm trzecich, które umożliwiają tworzenie modelu danych w identyczny sposób jak się tworzy model danych w LINQ to Entity.
 
Natrafiłem pisząc tego posta na dwa takie rozwiązania: LINQ to SharePoint DSL Extension for Visual Studio 2010 i VisualTools for SharePoint. Pierwsze wymienione rozszerzenie jest darmowe dlatego w dalszej części zaprezentuje metodę działania w oparciu o ten dodatek. Po ściągnięciu i zainstalowaniu dodatku do Visual Studio (do dodatku można ściągnąć również bardzo dobrą i obszerną dokumentację) możliwe jest utworzenie nowego typu pliku. Dodawanie nowego pliku do projektu dobywa się poprzez kliknięcie prawym klawiszem myszki na projekcie i z menu rozwijanego wybranie Add -> New Item ... .
 
Następnie w kolejnych krokach podaje się na jakiej podstawie ma zostać stworzony model danych. Można wpisać adres URL portalu lub skorzystać z jednego z szablonów. W przypadku tworzenia modelu na podstawie adresu URL możliwe jest wybranie jakie obiekty mają być importowane:
 

Po zakończeniu etapu konfiguracji w Visual Studio dostępny jest Designer o podobnej funkcjonalności do Designera z LINQ to Entity.
 

Kontynuując przykład należy utworzyć model danych dla listy Empolyees. Warto posłużyć się plikiem konfiguracyjnym i stworzyć plik *.bat do uruchomienia SPMetal. Wygenerowaną klasę należy dołączyć do projekty w Visual Studio.
 
Aby móc używać wyrażeń pisanych w LINQ należy dodać referencję do biblioteki: Microsoft.SharePoint.LINQ i dodatkowo w klasie w której będzie się używało LINQ należy dodać przestrzeń nazw: System.LINQ.
 
Dla celów demonstracyjnych należy dodać do WebParta 5 kontrolek: jedną kontrolkę typu Label o nazwie lDisplay, jeden TextBox o nazwie tbValue i trzy kontrolki Button o nazwach: btnAdd, btnEdit, btnDelete. Całość powinna wyglądać następująco:
 

Na początek w code behind kontrolki w metodzie Page_Load zostanie umieszczony kod odpowiadający za pobrania z użyciem LINQ wszystkich elementów z listy i wyświetlenie w kontrolce Label. 
Aby możliwe było odczytywanie danych należy najpierw stworzyć kontekst, w którym będą prowadzone wyszukiwania. Tworzenie kontekstu najlepiej zrobić z użyciem using:
 
using (EmployeesListDataContext dc = new EmployeesListDataContext(http://os-stg))
{ 
}
 
Cała metoda wygląda następująco:
        protected void Page_Load(object sender, EventArgs e)
        {
            using (EmployeesListDataContext dc = new EmployeesListDataContext("http://os-stg"))
            {
                var q = from employee in dc.Employees
                        select employee;

                StringBuilder writer = new StringBuilder(); 
                writer.Append("");
                foreach (var employee in q)
                {
                    writer.Append("");
                }
                writer.Append("
"); writer.Append(employee.FirstName); writer.Append(""); writer.Append(employee.LastName); writer.Append("
"); lDisplay.Text = writer.ToString(); } }
Po wybraniu pozycji Deploy z menu projektu, należy umieścić WebParta na stronie w SharePoint. Całość powinna wyglądać następująco:
 
Można teraz dowolnie zmieniać zapytanie w LINQ w celu otrzymania szukanych danych. Dla przykładu:

1. Query które zwróci osoby mające na imię Michał
	var q = from employee in dc.Employees
	                        where employee.FirstName == "Michał"
	                        select employee;

2. Query które zwróci dane posortowane w kolejności A - Z po kolumnie FirstName
	 var q = from employee in dc.Employees
	                        orderby employee.FirstName
	                        select employee;

3. Query które stworzy nowe słowo kluczowe z obiekcie z danymi
               var q = from employee in dc.Employees 
                       select new { DisplayName = employee.FirstName + " " + employee.LastName };

Oczywiście wszystkie te warunki można połączyć w jednym zapytaniu. Możliwe jest także podejrzenie zapytania w języku CAML, które odpowiada stworzonemu zapytaniu w LINQ. Robi się to w następujący sposób:
 
dc.Log = File.CreateText(@"C:\Log.xml");
 
gdzie dc jest obiektem kontekstu stworzonym na podstawie klasy EmployeesListDataContext (nazwa klasy z aktualnego projektu)
 
Dla celu zademonstrowania sposobu wykonania 3 podstawowych operacji na liście czyli: dodanie nowego elementu, edycji elementu, usunięcie elementu należy stworzyć trzy zdarzenia kliknięcia dla każdego z guzików. Poniżej przedstawione zostają przykłady uzupełnienia ciał metod:

1. Dodanie nowego elementu (przy tworzeniu nowego elementu do kolumny Title będzie wpisywana wartość z TextBoxa (tbValue))
	        protected void btnAdd_Click(object sender, EventArgs e)
	        {
	            using (EmployeesListDataContext dc = new EmployeesListDataContext("http://os-stg"))
	            {
	                ContactUser newUser = new ContactUser() { Title = tbValue.Text };
	                dc.Employees.InsertOnSubmit(newUser);
	                dc.SubmitChanges();
	            }
	        }
2. Edycja elementu (wyszukiwanie elementu odbywa się na podstawie ID wpisanego do TextBoxa (tbValue))
	        protected void btnEdit_Click(object sender, EventArgs e)
	        {
		using (EmployeesListDataContext dc = new EmployeesListDataContext("http://os-stg"))
	            {
	                ContactUser newUser = dc.Employees.FirstOrDefault(n => n.Id == int.Parse(tbValue.Text));
	                newUser.JobTitle = "Nazwa stanowiska";
	                dc.SubmitChanges();
	            }
	         }


3. Usunięcie elementu (usunięcie elementu odbywa się na podstawie ID wpisanego do TextBoxa (tbValue))
	        protected void btnDelete_Click(object sender, EventArgs e)
	        {
	            using (EmployeesListDataContext dc = new EmployeesListDataContext("http://os-stg"))
	            {
	                ContactUser newUser = dc.Employees.FirstOrDefault(n => n.Id == int.Parse(tbValue.Text));
	                dc.Employees.DeleteOnSubmit(newUser);
	                dc.SubmitChanges();
	            }
	        }

Warto zwrócić uwagę, że każde zapytanie w zatwierdzane jest operacją SubmitChanges(). Tak na prawdę właśnie w tym momencie wysyłane jest zapytanie do bazy. Daje to możliwość optymalizacji zapytań, dla przykładu można dodać, usunąć i edytować element za pomocą jednego tzw: "strzału do bazy".
 
Aby zaobserwować efekt działania ostatnich trzech zdarzeń należy ponownie wybrać deploy z menu projektu MN.LINQWebPart.
 
 Zobacz także:
Źródła: MN-LINQWebPart
 
 

Dodany: 2010-05-26 23:02:36 przez Michał Nikołajuk | Wypowiedzi: 2
Dodaj do Yahoo Bookmarks Dodaj do Facebook Dodaj do Twitter Dodaj do Live Dodaj do Yahoo MyWeb Dodaj do MySpace Dodaj do Google Bookmarks
Komentarze
pandora jewelry
de zapytanie w zatwierdzane jest operacją SubmitChanges(). Tak na prawdę właśnie w tym momencie wysyłane jest zapytanie do bazy. Daje to możliwość optymalizacji zapytań, dla przykładu można dodać<strong><a href="http://www.pandora-uk.org/">pandora charms</a></strong>, usunąć i edytować element za pomocą jednego tzw: "strzału do bazy".
2010-09-09 08:58:33
pandora
de zapytanie w zatwierdzane jest operacją SubmitChanges(). Tak na prawdę właśnie w tym momencie wysyłane jest zapytanie do bazy. Daje to możliwość optymalizacji zapytań, dla przykładu można dodać, usunąć i edytować element za pomocą jednego tzw: "strzału do bazy".
2010-09-09 08:57:30
Zostaw komentarz Subskrybuj



 Security code