SharePoint, LINQ, OData

42
SharePoint, LINQ и Open Data Protocol Vitaly Baum Senior SharePoint Developer @ Conteq Активный участник групп разработчиков в Санкт- Петербурге и Москве, подкастер и блоггер http://butaji.ru

description

Презентация с семинара "LINQ'остроительство и SharePoint"

Transcript of SharePoint, LINQ, OData

Page 1: SharePoint, LINQ, OData

SharePoint, LINQ иOpen Data Protocol

Vitaly BaumSenior SharePoint Developer @ Conteq Активный участник групп разработчиков в Санкт-Петербурге и Москве, подкастер и блоггерhttp://butaji.ru

Page 2: SharePoint, LINQ, OData

План выступления

LINQ to SharePoint 2010Open Data Protocol

Page 3: SharePoint, LINQ, OData

LINQ to SharePoint

Page 4: SharePoint, LINQ, OData

Преимущества LINQ

Строгая типизацияЗапросы к реляционным данным в строго-типизированной формеКомпилятор проверит ошибки в запросахIntelliSense

Унифицированный путь получения данных из любого источника

Page 5: SharePoint, LINQ, OData

LINQ to SharePoint

SPMetalГенерирует DataContextSPMetal /web:http://ContosoServer/Marketing /code:MarketingSite.cs 

Page 6: SharePoint, LINQ, OData

LINQ to SharePoint

НедостаткиПреобразуется в CAMLНе все операторы реализованыДвухэтапные запросыАггрегирующие запросыSPSiteDataQuery

Page 7: SharePoint, LINQ, OData

Mapping

internal partial class OrganisationSiteDataContext : Microsoft.SharePoint.Linq.DataContext{}

[ContentType(Name = "Employee")]public partial class Employee{

[Column(Name="ID", IsId=true, ReadOnly=true, FieldType="Counter")] public int Id {get; set;}

}

Page 8: SharePoint, LINQ, OData

ICostumMapping

public partial class Project : ICustomMapping{

[CustomMapping(Columns = new String[] { «Due_x0020_Date», «IsCancelled» })] public void MapFrom(object listItem) {

this.DueDate = ((SPListItem)listItem)[“Due_x0020_Date”]; this.IsCancelled = ((SPListItem)listItem)[“IsCancelled”];

} public void MapTo(object listItem) {

((SPListItem)listItem)[“Due_x0020_Date”] = this.DueDate; ((SPListItem)listItem)[“IsCancelled”] = this.IsCancelled;

} public void Resolve(RefreshMode mode, object originalListItem, object databaseObject){ }

}

Page 9: SharePoint, LINQ, OData

SPMetal

Imtech SPMetal Definition Extension

Page 10: SharePoint, LINQ, OData

LINQ to SharePoint

Демо

Page 11: SharePoint, LINQ, OData
Page 12: SharePoint, LINQ, OData

Open Data Protocol

Открытый доступ к даннымОткрытые форматы данныхУнифицированная форма запросов

Page 13: SharePoint, LINQ, OData

Open Data Protocol

Открытый доступ к даннымHTTP

Открытые форматы данныхAtomPub, JSON

Унифицированная форма запросовLINQ

Page 14: SharePoint, LINQ, OData

Open Data Protocol

Уровень абстракцииШирокого доступаУнифицированного доступаПростого доступа

Page 15: SharePoint, LINQ, OData

Open Data Protocol

ПотребителиБраузерыOData ExplorerExcel 2010 (PowerPivot)LinQPadVisual Studio…

Page 16: SharePoint, LINQ, OData

Open Data Protocol

http://services.odata.org/OData/OData.svc/<service xml:base="http://services.odata.org/OData/OData.svc/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app"> <workspace> <atom:title>Default</atom:title> <collection href="Products"> <atom:title>Products</atom:title> </collection> <collection href="Categories"> <atom:title>Categories</atom:title> </collection> <collection href="Suppliers"> <atom:title>Suppliers</atom:title> </collection> </workspace> </service>

Page 17: SharePoint, LINQ, OData

Open Data Protocol

http://services.odata.org/OData/OData.svc/Products<?xml version="1.0" encoding="windows-1251" standalone="yes"?><feed xml:base="http://services.odata.org/OData/OData.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> <title type="text">Products</title> <id>http://services.odata.org/OData/OData.svc/Products</id> <updated>2010-07-01T20:01:57Z</updated> <link rel="self" title="Products" href="Products" /> <entry> <id>http://services.odata.org/OData/OData.svc/Products(0)</id> <title type="text">Bread</title> <summary type="text">Whole grain bread</summary> <updated>2010-07-01T20:01:57Z</updated> <author> <name /> </author>…

Page 18: SharePoint, LINQ, OData

Open Data Protocol

http://services.odata.org/OData/OData.svc/Products(4)<?xml version="1.0" encoding="windows-1251" standalone="yes"?><entry xml:base="http://services.odata.org/OData/OData.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> <id>http://services.odata.org/OData/OData.svc/Products(4)</id> <title type="text">Fruit Punch</title> <summary type="text">Mango flavor, 8.3 Ounce Cans (Pack of 24)</summary> <updated>2010-07-01T20:03:37Z</updated> <author> <name /> </author> <link rel="edit" title="Product" href="Products(4)" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Category" type="application/atom+xml;type=entry" title="Category" href="Products(4)/Category" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier" type="application/atom+xml;type=entry" title="Supplier" href="Products(4)/Supplier" /> <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> <content type="application/xml"> <m:properties> <d:ID m:type="Edm.Int32">4</d:ID> <d:ReleaseDate m:type="Edm.DateTime">2003-01-05T00:00:00</d:ReleaseDate> <d:DiscontinuedDate m:type="Edm.DateTime" m:null="true" /> <d:Rating m:type="Edm.Int32">3</d:Rating> <d:Price m:type="Edm.Decimal">22.99</d:Price> </m:properties> </content></entry>

Page 19: SharePoint, LINQ, OData

Open Data Protocol

Типы данныхNullBinaryBooleanByteDateTimeDecimalDouble

SingleGuidInt16, Int32, Int64SbyteStringTimeDateTimeOffset

Page 20: SharePoint, LINQ, OData

Open Data Protocol

http://localhost:8080/owind.svc/Categories(2)/Products<feed xml:base="http://localhost:8080/owind.svc/" ...> ... <entry> ... <link rel="edit" title="Product" href="Products(3)" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Category" type="application/atom+xml;type=entry" title="Category" href="Products(3)/Category" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Order_Details" type="application/atom+xml;type=feed" title="Order_Details" href="Products(3)/Order_Details" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier" type="application/atom+xml;type=entry" title="Supplier" href="Products(3)/Supplier" /> ... <content type="application/xml"> <m:properties> <d:ProductID m:type="Edm.Int32">3</d:ProductID> <d:ProductName>Aniseed Syrup</d:ProductName> ... </m:properties> </content> </entry> ...</feed>

Page 21: SharePoint, LINQ, OData

Open Data Protocol

http://localhost:8080/owind.svc/Categories(2)/Products<feed xml:base="http://localhost:8080/owind.svc/" ...> ... <entry> ... <link rel="edit" title="Product" href="Products(3)" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Category" type="application/atom+xml;type=entry" title="Category" href="Products(3)/Category" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Order_Details" type="application/atom+xml;type=feed" title="Order_Details" href="Products(3)/Order_Details" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier" type="application/atom+xml;type=entry" title="Supplier" href="Products(3)/Supplier" /> ... <content type="application/xml"> <m:properties> <d:ProductID m:type="Edm.Int32">3</d:ProductID> <d:ProductName>Aniseed Syrup</d:ProductName> ... </m:properties> </content> </entry> ...</feed>

Page 22: SharePoint, LINQ, OData

Open Data Protocol

http://localhost:8080/owind.svc/Categories(2)/Description<Description xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">

Sweet and savory sauces, relishes, spreads, and seasonings</Description>

Page 23: SharePoint, LINQ, OData

Open Data Protocol

http://localhost:8080/owind.svc/Categories(2)/Description/$value

Sweet and savory sauces, relishes, spreads, and seasonings

Page 24: SharePoint, LINQ, OData

Open Data Protocol

http://localhost:8080/owind.svc/Categories/$count

8

Page 25: SharePoint, LINQ, OData

Open Data Protocol

http://localhost:53211/owind.svc/Categories(4)/$links/Products<links xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices"> <uri>http://localhost:53211/owind.svc/Products(11)</uri> <uri>http://localhost:53211/owind.svc/Products(12)</uri> <uri>http://localhost:53211/owind.svc/Products(31)</uri> <uri>http://localhost:53211/owind.svc/Products(32)</uri> <uri>http://localhost:53211/owind.svc/Products(33)</uri> <uri>http://localhost:53211/owind.svc/Products(59)</uri> <uri>http://localhost:53211/owind.svc/Products(60)</uri> <uri>http://localhost:53211/owind.svc/Products(69)</uri> <uri>http://localhost:53211/owind.svc/Products(71)</uri> <uri>http://localhost:53211/owind.svc/Products(72)</uri> </links>

Page 27: SharePoint, LINQ, OData

Open Data Protocol

<html><head> <title>OData JSON Test</title> <script src="/Scripts/jquery-1.3.2.js" type="text/javascript"></script></head><body> <script type="text/javascript"> $(document).ready(function () { $("#foo").text("fetching..."); var url = "http://localhost:8080/owind.svc/Categories/"; $.getJSON(url, function (result) { $("#foo").text(result.d[0].CategoryName); }); }); </script> <p id="foo">loading page...</p></body></html>

Page 28: SharePoint, LINQ, OData

Open Data Protocol

Объявлять функцииВыдавать данные в JSONНаслаждаться жизнью

Page 29: SharePoint, LINQ, OData

Open Data Protocol

ПоставщикиSharePoint 2010IBM WebSphereSQL AzureAzure Table StorageSQL Reporting Services…

Page 30: SharePoint, LINQ, OData

Open Data Protocol

ПоставщикиFacebookNetflixPluralsightStack OverflowCodename Dallas…

Page 31: SharePoint, LINQ, OData

Browser, Visual Studio, Python

Демо

Page 32: SharePoint, LINQ, OData

Готовим OData

Page 33: SharePoint, LINQ, OData

Готовим OData

Парочка IQueryable<T>ADO.NET Data Services v1.5Немного желания

Page 34: SharePoint, LINQ, OData

Готовим ODataEntity Framework, LINQ to SQL

public class ProductService : DataService<ProductEntities>{

public static void InitializeService(DataServiceConfiguration config){ // Give readonly access to all of the entities config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); // Pagesize will change the max number of rows returned config.SetEntitySetPageSize("*", 25);

config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;}

}

Page 35: SharePoint, LINQ, OData

Готовим ODataReflection Provider

public class MyDataSource { public IQueryable<Product> Products { get {…} } public IQueryable<Categories> Categories { get {…} } }

public class MyDataSourceService : DataService<MyDataSource>{

…}

Page 36: SharePoint, LINQ, OData

Готовим OData

Демо

Page 37: SharePoint, LINQ, OData

OData в SharePoint

Page 38: SharePoint, LINQ, OData

SharePoint OData

Client Application

Content databaseSharePoint Data

LINQ to SharePoint

ListData.svc

AtomJSON Post, Put, Get

Любая платформа .NET, Java,Flash, Silverlight

SharePoint

Page 39: SharePoint, LINQ, OData

SharePoint OData

Операции и HTTP действияПолучение данных GETСоздание записи POSTИзменение записи PUT или MERGEУдаление записи DELETEИ всё это действует на ссылки

Все политики SharePoint работаютВалидация, Контроль доступа и т.д.

Page 40: SharePoint, LINQ, OData

OData в SharePoint

Демо

Page 41: SharePoint, LINQ, OData

Vitaly Baumhttp://[email protected]