Sharepoint 2010 effettuare ricerche tramite SPSiteDataQuery

L'articolo, vuole fornire indicazioni in materia di ricerca da codice (VB.Net e C#) in ambito di Sharepoint 2010 tramite la classe SPSiteDataQuery.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

Introduzione

In sharepoint, può capitare di dover effettuare delle ricerche all'interno delle document library o dagli oggetti che espone questa piattaforma.

Il sistema offre diverse soluzione, quella che vedremo in questo articolo, riguarda l'utilizzo della classe spsitedataquery, per rilevare i dati di determinati documenti, tramite il valore di una nostra colonna creata in precedenza.

Dopo aver creato un nuovo progetto di sharepoint, si aggiunge una pagina o web part, in cui verranno visualizzati i dati del documento inserito in una document library.

Nel caso che si ha una document library, aggiungere una colonna con il nome "NewColonna" di tipo yes/no, il tutto come mostrato in figura 1.





Figura 1

A questo punto inseriamo un certo numero di elementi nella document library, in modo che tale colonna viene valorizza.







Figura 2


Ritorniamo sul nostro ambiente di sviluppo, visual studio 2010, e nella web part, nell'evento click del pulsante, o nella pagina, qualora si è deciso di crearne, scriviamo il codice
Con la funzione runWithElevatedPrivileges, si ha la possibilità di eseguire la funzione, con il privileggi da amminsitratore.
La classe spsitedaquery, ci permtte di eseguire una query (stile xml) imposta i campi da visualizzare, i campi da condizione.

VB.Net
Protected Sub BtnTrova_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BtnTrova.Click
            SPSecurity.RunWithElevatedPrivileges(AddressOf Trova_Click)
    End Sub
    Private Sub Trova_Click()
        Try
            Dim SpDataQuery As New SPSiteDataQuery()
            SpDataQuery.Lists = "<Lists BaseType='1'>"
            SpDataQuery.ViewFields = "<FieldRef Name='NewColonna' />"
            SpDataQuery.ViewFields += "<FieldRef Name='Title' />"
            SpDataQuery.ViewFields += "<FieldRef Name='FileRef' />"
            SpDataQuery.ViewFields += "<FieldRef Name='LinkFilename' />"
            SpDataQuery.ViewFields += "<FieldRef Name='Created' />"
            SpDataQuery.ViewFields += "<FieldRef Name='_UIVersionString' />"
            SpDataQuery.Webs = "<Webs Scope='SiteCollection'/>"
            SpDataQuery.RowLimit = 100
            SpDataQuery.Query = "<Where>" + _
                "<And>" + _
                "<Contains>" + _
                "<FieldRef Name='NewColonna'/>" + _
                "<Value Type='Integer'>1</Value>" + _
                "</Contains>" + _
                "<Contains>" + _
                "<FieldRef Name='_UIVersionString'/>" + _
                "<Value Type='Text'>.0</Value>" + _
                "</Contains>" + _
                "</And>" + _
                "</Where>"
            Dim Dtdati As New DataTable()
            Using sito As New SPSite(SPContext.Current.Site.Url)
                Dtdati = sito.OpenWeb().GetSiteData(SpDataQuery)
            End Using
            For Each drRighe As DataRow In Dtdati.Rows
                Dim testo2 As New LiteralControl("<h5>Documento: <A href=\" + SPContext.Current.Site.Url + "/" + drRighe("FileRef").ToString().Substring(drRighe("FileRef").ToString().IndexOf("#") + 1) + "\>" + drRighe("Title") + " - " + "</A></h5>")
                Me.Controls.Add(testo2)
            Next
        Catch ex As SPException
            Dim testoErroresp As New LiteralControl("<h5>" + ex.Message + "</h5>")
            Me.Controls.Add(testoErroresp)
        Catch exGenerica As Exception
            Dim testoErroresp As New LiteralControl("<h5>" + exGenerica.Message + "</h5>")
            Me.Controls.Add(testoErroresp)
        End Try
    End Sub
C#
 protected void BtnTrova_Click(object sender, EventArgs e)
        {
            try
            {
                SPSecurity.RunWithElevatedPrivileges(
                    delegate()
                    {
                        SPSiteDataQuery SpDataQuery = new SPSiteDataQuery();                        
                        SpDataQuery.Lists = "<Lists BaseType=\"1\" />";
                        SpDataQuery.ViewFields = "<FieldRef Name=\'NewColonna\' />";
                        SpDataQuery.ViewFields += "<FieldRef Name=\'Title\' />";
                        SpDataQuery.ViewFields += "<FieldRef Name=\'FileRef\' />";
                        SpDataQuery.ViewFields += "<FieldRef Name=\'LinkFilename\' />";
                        SpDataQuery.ViewFields += "<FieldRef Name=\'Created\' />";
                        SpDataQuery.ViewFields += "<FieldRef Name=\'_UIVersionString\' />";
                        SpDataQuery.Webs = "<Webs Scope=\"SiteCollection\"/>";
                        SpDataQuery.RowLimit = 100;
                        SpDataQuery.Query = "<Where>" +
                            "<And>" +
                            "<Contains>" +
                            "<FieldRef Name=\"NewColonna\"/>" +
                            "<Value Type=\"Integer\">1</Value>" +
                            "</Contains>" +
                            "<Contains>" +
                            "<FieldRef Name=\"_UIVersionString\"/>" +
                            "<Value Type=\"Text\">.0</Value>" +
                            "</Contains>" +
                            "</And>" +
                            "</Where>";
                        DataTable Dtdati = new DataTable();
                        using (SPSite site = new SPSite(SPContext.Current.Site.Url))
                        {
                            Dtdati = site.OpenWeb().GetSiteData(SpDataQuery);
                        }
                        foreach (DataRow drRighe in Dtdati.Rows)
                        {
                            LiteralControl testo2 = new LiteralControl("<h5>Documento: <A href=\"" + SPContext.Current.Site.Url + "/" + drRighe["FileRef"].ToString().Substring(drRighe["FileRef"].ToString().IndexOf("#") + 1) + "\">" + drRighe["Title"] + " - " + "</A></h5>");
                            this.Controls.Add(testo2);
                        }
                    });
            }
            catch (SPException sperrore)
            {
                LiteralControl testoErroresp = new LiteralControl("<h5>" + sperrore.Message + "</h5>");
                this.Controls.Add(testoErroresp);
            }
            catch (Exception errore)
            {
                LiteralControl testoErroresp = new LiteralControl("<h5>" + errore.Message + "</h5>");
                this.Controls.Add(testoErroresp);
            }
        }



Ora non ci resta che pubblicare la nostra web part, tramite il tasto destro sul nome del progetto, selezioniamo deploy.

Apriamo il nostro sito di Sharepoint, e modifichiamo una pagina (va bene anche la precedente) , passasdo il modalità modifica, il tutto tramite il pulsante di modifica.

Tramite il menu, selezioniamo la voce "Editing Tools" e selezioniamo Insert, tra i vari pulsanti, seleziamo web part. Come mostrato in figura 3





Figura 3


A questo punto, selezionando la categoria Custom, nella parte destra, verranno visualizzate le web part pubblicate.
Selezioniamo quella di nostro interesse, e facciamo click sul pulsante add.
Terminata tale operazione, non ci resta che salvare tutto il progetto e testare la nostra applicazione.
Con Visual Studio 2010, possiamo eseguire senza difficoltà il debug, e verificare riga per riga il codice.


Conclusioni

L'articolo ha voluto fornire una delle tante tecniche per effettuare delle ricerche nel portale Sharepoint, ricerche cross site, su più siti e su più ambiti.