spug pt linqtosharepoint
DESCRIPTION
Comunidade Portuguesa de SharePoint - Linq to SharePointTRANSCRIPT
Comunidade Portuguesa de SharePoint
10ª Reunião Presencial
16/04/2011
Thank you for sponsoring!
Agenda
09:30 Recepção10:00 Abertura10:30 Linq to SharePoint com André Vala 11:30 Coffee-break 11:45 Painel de Discussão 13:00 Final da Reunião & Almoço
LINQ to SharePoint
LINQ to SharePoint
LINQ?
LINQ to SharePoint?
Desenvolvimento com LINQ
Common Pitfalls
Performance
Cenários de uso
DEMO
DEMO
DEMODEMO
DEMO
LINQ?
LINQ = Language Integrated Query• LINQ to SQL• LINQ to Objects• LINQ to XML• LINQ to ?
DadosLINQ Provider
APP
.NET Query
.NET Dados
LINQ Data Context• Ponto de entrada para o LINQ• Permite obter e actualizar informação na fonte de
dados• Traduz queries sobre objectos em queries na
linguage nativa da fonte de dados, e constrói objectos a partir dos resultados provenientes da fonte de dados
DadosLINQ Provider
APP
.NET Query
.NET DadosDat
a Co
ntex
t
LINQ to SQLusing System.Data.Linq;DataContext db = new DataContext(@”mydatabase.mdf”);
Table<BankAccount> BankAccounts = db.GetTable<BankAccount>();
var query =from account in BankAccountswhere account.Bank == “Millennium BCP”select account;
foreach (BankAccount account in query){
Console.WriteLine(“Number: {0}”, account.Number);}
LINQ to SharePoint?
• Utiliza um LINQ to SharePoint provider– Microsoft.SharePoint.Linq.dll– Transforma .NET em CAML– Transforma List Items em .NET
SharePointLINQ to SharePoint
APP
.NET CAML
.NET List Items
LINQ to SharePointusing Microsoft.SharePoint.Linq;DataContext data = new DataContext(SPContext.Current.Web.Url);
EntityList<BankAccount> BankAccounts = data.GetList<BankAccount>(“BankAccounts”);
var query =from account in BankAccountswhere account.Bank == “Millennium BCP”select account;
foreach (BankAccount account in query){
Console.WriteLine(“Number: {0}”, account.Number);}
DEMO: Hello LINQ!
Desenvolvimento com LINQ
• Entidades• Adicionar Itens• Eliminar Itens• Reciclar Itens• Actualizar Itens• Logging
Entidades
• Content Type Entidade Classe• Coluna Atributo Membro
BankAccount account = new BankAccount(){
Number = “99100048169”,Bank = “Millennium BCP”
};
Entidades Definição Manual[ContentType(Name=“BankAccount”, Id=“0x0104”)]public partial class BankAccount{
[Column(Name=“Number”, FieldType=“Text”)]public string Number { get; set; }
[Column(Name=“Bank”, FieldType=“Text”)]public string Bank { get; set; }
}
Entidades Geração Automática
SPMetalFerramenta para gerar as entidades para um conjunto de content types / listas
Onde está?C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN
Como se usa?SPMetal
/web:http://createbox /code:BankAccounts.cs/namespace:MyApp.SharePoint.Data
Adicionar Itensusing Microsoft.SharePoint.Linq;DataContext data = new DataContext(SPContext.Current.Web.Url);
BankAccount account = new BankAccount(){
Number = “99100048169”,Bank = “Millennium BCP”
};
data.BankAccounts.InsertOnSubmit(account);
data.SubmitChanges();
Eliminar Itensusing Microsoft.SharePoint.Linq;DataContext data = new DataContext(SPContext.Current.Web.Url);
foreach (BankAccount account in data.BankAccounts){
if (account.Bank == “Millennium BCP”)data.BankAccounts.DeleteOnSubmit(account);
}
data.SubmitChanges();
Reciclar Itensusing Microsoft.SharePoint.Linq;DataContext data = new DataContext(SPContext.Current.Web.Url);
foreach (BankAccount account in data.BankAccounts){
if (account.Bank == “Millennium BCP”)data.BankAccounts.RecycleOnSubmit(account);
}
data.SubmitChanges();
Actualizar Itensusing Microsoft.SharePoint.Linq;DataContext data = new DataContext(SPContext.Current.Web.Url);
foreach (BankAccount account in data.BankAccounts){
if (account.Bank == “Millennium BCP”)account.Bank = “BES”;
}
data.SubmitChanges();
Loggingusing Microsoft.SharePoint.Linq;DataContext data = new DataContext(SPContext.Current.Web.Url);
StringWriter writer = new StringWriter();data.Log = writer;
// queries LINQ(...)
string caml = writer.ToString();
DEMO: LINQing
Common Pitfalls
• To Dispose or Not to Dispose• Acesso anónimo• Display Names
Pitfall To Dispose or Not to DisposeDataContext data = new DataContext(“http://createbox”);
Dispose? SIM
DataContext data = new DataContext(SPContext.Current.Web.Url);
Dispose? NÃO
string webUrl = SPContext.Current.Web.Site.RootWeb.Url;DataContext data = new DataContext(webUrl);
Dispose? SIM
1
2
3
Pitfall To Dispose or Not to Disposeusing (DataContext data = new DataContext(“http://createbox”)){
(...)}
DataContext data = new DataContext(SPContext.Current.Web.Url);(...)
string webUrl = SPContext.Current.Web.Site.RootWeb.Url;using (DataContext data = new DataContext(webUrl)){
(...)}
1
2
3
Pitfall Acesso Anónimo
• LINQ to SharePoint não suporta acesso anónimo
• Há um workaround mas tem desvantagens:– Grande impacto no desempenho– Utiliza RunWithElevatedPrivileges
• Solução: regressar ao CAML...
DEMO: Acesso Anónimo
Pitfall Display Names
• SPMetal utiliza o Display Name das colunas para gerar os membros das classes
• O que acontece quando os nomes das colunas têm caracteres especiais? POIS...
• E como é que isso se resolve?...
DEMO: Display Names
Performance
• Object Tracking Enabled• LINQ vs CAML
Performance Object Tracking Enabled
Permite optimizar o desempenho em acessos read-only...
DataContext data = new DataContext(SPContext.Current.Web.Url);data.ObjectTrackingEnabled = false;
Performance LINQ vs CAML
• A tradução LINQ para CAML é feita em tempo real
• Existe uma penalização no desempenho• A query gerada pode ser ineficiente• Nem todas operações definidas em LINQ são
suportadas em CAML...
DEMO: Performance
Cenários de Uso
• Muito simples de usar mas não é a solução quando...– Código tem que correr no cliente– A solução tem que suportar acesso anónimo– O desempenho é crítico– Existem colunas lookup que se referem a listas
noutros sites da mesma site collection
Referências
MSDN: Using LINQ to SharePointhttp://msdn.microsoft.com/en-us/library/ee535491.aspx
Vídeos no Channel 9http://channel9.msdn.com/Learn/Courses/SharePoint2010Developer/LINQtoSharePointUnit
Comunidade Portuguesa de SharePoint
10ª Reunião Presencial
16/04/2011