Home > SharePoint - Tips & Tricks > Executando Queries de Alta Performance com SPSiteDataQuery

Executando Queries de Alta Performance com SPSiteDataQuery


Olá! Smile

Cenário:

Meu grande amigo postou recentemente uma série de posts sobre como o SharePoint pode armazenar listas com grandes quantidades de informação:

http://rodrigoromano.net/2012/04/12/trabalhando-com-listas-grandesparte-i/ – Trabalhando com listas “grandes”–Parte I

http://rodrigoromano.net/2012/04/18/trabalhando-com-listas-grandesparte-2/ – Trabalhando com listas “grandes” – Parte 2

Para auxiliar esse processo, o Object Model do SharePoint possui um objeto excepcional para executar queries de alta performance. Esse objeto é o SPSiteDataQuery (http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsitedataquery.aspx).

Diferente do objeto comum de queries, o SPQuery (http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.aspx) que só pode ser executado em uma única lista (SPList) por vez, o SPSiteDataQuery pode executar queries em mais de uma lista e em mais de um site. Ou seja, ele é cross-site e cross-lista, e a performance é absurdamente melhor. Então, se puder, utilize o SPSiteDataQuery quando for retornar informações que obedecem mesma condição em várias listas/sites.

SOLUÇÃO:

Para utilizar o SPSiteDataQuery em nossas queries, precisamos definir algumas propriedades:

SPSiteDataQuery.Webs: Define o escopo da query. Por padrão (string.Empty), irá buscar apenas no site (SPWeb) em que rodamos o SPSiteDataQuery.

· "<Webs Scope=’SiteCollection’ />": Define o escopo para buscar em todos os sites da coleção de sites (SPSite).

· "<Webs Scope=’Recursive’ />": Define o escopo para buscar no site (SPWeb) que está rodando o SPSiteDataQuery e em todos seus subsites.

SPSiteDataQuery.Lists: Define quais listas incluir na query.

· Podemos utilizar o template da lista (Ex: "<Lists ServerTemplate=\"105\" />"; – Esse exemplo busca apenas as listas com template 105 ou seja, as listas de Contatos do SharePoint) ou GUIDs das listas que queremos pesquisar (Ex: "<Lists><List ID=’416E2D08-46F1-4029-9729-C1B73850BF12′ /><List ID=’923CD349-6A71-46DE-9A2D-7F6703EC0756’/></Lists>").

SPSiteDataQuery.ViewFields: Definimos quais fields queremos retornar na query. Por padrão, se não especificarmos nenhum campo, será retornado WebId, ListId e ID de cada item encontrado.

· Ex: "<FieldRef Name=’Title’ Type=’Text’ /><FieldRef Name=’ID’ Type=’Counter’/><FieldRef Name=’Author’ Type=’User’/><FieldRef Name=’Created’ Type=’DateTime’/><FieldRef Name=’Modified’ Type=’DateTime’/>";

E finalmente,

SPSiteDataQuery.Query: Definimos a condição que os itens retornados devem obedecer, ou simplesmente ordenamos os resultados.

· Ex: “<OrderBy><FieldRef Name=’Modified’ Ascending=’False’/></OrderBy>”;

Opcionalmente, podemos limitar a quantidade de items retornados com SPSiteDataQuery.RowLimit.

Na íntegra:

 

protected override void CreateChildControls()
{
using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
using (SPWeb web = site.OpenWeb())
{
try
{
SPSiteDataQuery q = new SPSiteDataQuery();
q.Lists = "<Lists><List ID='416E2D08-46F1-4029-9729-C1B73850BF12' /><List ID='923CD349-6A71-46DE-9A2D-7F6703EC0756'/></Lists>";
q.Webs = "";
q.Query = "<OrderBy><FieldRef Name='Modified' Ascending='False'/></OrderBy>";
q.ViewFields = @"<FieldRef Name='Title' Type='Text' /><FieldRef Name='ID' Type='Counter'/><FieldRef Name='Author' Type='User'/><FieldRef Name='Created' Type='DateTime'/><FieldRef Name='Modified' Type='DateTime'/>";
q.RowLimit = 10;

DataTable dt = web.GetSiteData(q);
DataView dv = new DataView(dt);

GridView grid = new GridView();
grid.DataSource = dv;
grid.AutoGenerateColumns = false;
grid.Width = Unit.Percentage(100);
grid.CssClass = "whatsnew";

BoundField boundField = new BoundField();
boundField.HeaderText = "Nome";
boundField.DataField = "Title";
grid.Columns.Add(boundField);

boundField = new BoundField();
boundField.HeaderText = "Criado Por";
boundField.DataField = "Author";
grid.Columns.Add(boundField);

this.Controls.Add(grid);
}
catch (Exception ex)
{
ULSLogging.LogErrorInULS(ex, "What's New");
}
}
}
}

 

Abraço!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

%d bloggers like this: